2011-12-28 4 views
1

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


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(); 

Однако во время выполнения запроса ниже получает genereated, который имеет дополнительную 'группу по 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, OPSTATUS t2 WHERE (t0.OPERATIONTYPE =? И t0.RECEIVEDFLAG =? И t0.SENDTIME IN (SELECT MAX (t1.SENDTIME) FROM OPSTATUS t1 WHERE (t1.OPERATIONTYPE =? AND t1.RECEIVEDFLAG =?) GROUP BY t1.DN)) GROUP BY t2.DN [params = ?,?,? ,?]


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

ответ

0

Возможно, вы выбрали последнюю запись в каждой группе Dn. Если две разные Dn имеют одно и то же начальное время, и только один из них является последним (макс.), Ваш запрос будет терпеть неудачу. Поскольку 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" 
Смежные вопросы