HQL / JPQL - Вложенный выбор на ОТ - PullRequest
5 голосов
/ 05 августа 2011

Я пытаюсь преобразовать свой SQL-запрос в HQL или JPQL (я хочу использовать сопоставление объектов).

Мой запрос SQL:

SELECT * 
FROM (SELECT bde, MAX(creation_date) 
      FROM push_campaign GROUP BY bde) temp, 
push_campaign pc where pc.bde = temp.bde and pc.creation_date = temp.creation_date;

Я пытаюсь (безуспешно) конвертировать его в JPQL с помощью:

select pc 
from (select bde, max(creationDate) 
      from PushCampaign group by bde) temp, 
PushCampaign pc 
where pc.bde = temp.bde and pc.creationDate = temp.creationDate

Но я вырос:

IllegalArgumentException occured :

org.hibernate.hql.ast.QuerySyntaxException: неожиданный токен: (рядом строка 1, столбец 16 [выберите ПК из (выберите идентификатор, макс. (creationDate) из группа models.PushCampaign по bde) temp, models.PushCampaign pc где pc.id = temp.id]

Я прочитал, что вложенный выбор может быть только в предложении select или where.

У вас есть обходные пути, чтобы сохранить запрос и выгоду от сопоставления объектов?

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Невозможно с JPQL или HQL в одном запросе.

Чтобы сделать это в одном запросе, я предлагаю следующее:

String campaignToLaunch = "select pc.* from PushCampaign pc ..."
//SQL request which return a resultset compatible with the models.PushCampaign class
Class className = Class.forName("models.PushCampaign");
List<PushCampaign> result = JPA.em()
                           .createNativeQuery(campaignToLaunch,className)
                           .getResultList();
3 голосов
/ 08 августа 2011

это должно достичь аналогичных результатов

select pc
from PushCampaign pc 
where pc.creationDate =
(select max(creationDate) from PushCampaign inner where inner.bde = pc.bde)
2 голосов
/ 18 июля 2013

Простое решение может быть:

servlet
{
    Query q = entityManager.createNativeQuery("SQL");
    List<> li =  q.getResultList();

    @PersistenceContext(unitName="UNIT")
    private EntityManager entityManager;
}
...