JPA запросить дополнительную группу по - PullRequest
1 голос
/ 28 декабря 2011

Как написать запрос JPA для ниже SQL?


select * from opstatus o where o.OPERATIONTYPE=2 and o.RECEIVEDFLAG =2 and o.SENDTIME in (select max(o1.SENDTIME)from opstatus o1 where (o1.OPERATIONTYPE=2 and o1.RECEIVEDFLAG =2) group by o1.dn);

Попытка выполнить следующий запрос


result = em.createQuery("select o from DTO o where "
+ "o.operationType=:operationType"
+ " and o.receivedFlag = :receivedFlag"
+ " and o.startTime in (select max(o1.startTime)from DTO o1 where   
o1.receivedFlag = :receivedFlag group by o1.Dn) order by o.startTime").
setParameter("operationType","2").
setParameter("receivedFlag", "2").getResultList();

Однако, во время выполнения ниже генерируется запрос, который имеет дополнительную «группу по T2.DN», для которой мы получаем «org.apache.openjpa.persistence.PersistenceException: ORA-00979: не выражение GROUP BY»


ВЫБЕРИТЕ t0.OPERATIONID, t0.CURRENTSTEP, t0.DETAILEDSTEPS, t0.DN, t0.OPERATIONTYPE, t0.RECEIVEDFLAG, t0.REQUESTID, t0.SENDTIME ОТ OPSTATUS t0, ИСПОЛЬЗОВАНИЕ t0 ИЛИ T0ER .RECEIVEDFLAG =? И t0.SENDTIME IN (ВЫБЕРИТЕ МАКС. (T1.SENDTIME) ОТ ОПСТАТА t1 ГДЕ (t1.OPERATIONTYPE =? И t1.RECEIVEDFLAG =?) GROUP BY t1.DN)) GROUP BY t2.DN [params =? ,?,?,?]


Как предотвратить добавление дополнительной группы путем добавления? Я пытался добавить 'order by o.sendtime' без толку.

1 Ответ

0 голосов
/ 13 апреля 2012

Вы имели в виду выбрать последнюю запись в каждой группе Dn. Если два разных Dn имеют одинаковое startTime и только один из них является последним (max), ваш запрос не будет выполнен. Поскольку o1 в подзапросе не связан с внешним o, OpenJPA сгенерирует FROM OPSTATUS t0, OPSTATUS t2

Может быть, вы можете изменить свой запрос.

"select o from DTO o where "
+ "o.operationType=:operationType"
+ " and o.receivedFlag = :receivedFlag"
+ " and not exists (select o1 from DTO o1 where   
o1.receivedFlag = :receivedFlag and o1.Dn = o.Dn and o1.startTime > o.startTime) order by o.startTime"
...