2
我正在使用eclipselink v2.3在我的java代碼中編寫一個簡單查詢。 此查詢必須只返回一個字符串和兩個整數,沒有什麼奇怪的,我認爲,至少我認爲,使用EclipseLink將多個「Select Case」語句導入到集合命名查詢中
查詢我的建築是這樣的:
q = entityManager.createQuery(
"SELECT new com.myclass.CalculationQueryResult(transits.device.name,"
+ " SUM(case when transits.direction = 1 then 1 else 0 end) ,"
+ " SUM(case when transits.direction = 0 then 1 else 0 end)) from Transits_Log transits "
+ " where transits.device.name in :devices and transits.dateTime >= :startDate"
+ " and transits.dateTime < :endDate group by transits.device.name" + " order by transits.device.name",
CalculationQueryResult.class);
雖然,obviuosly在工作SQL Server(我們的本機對象),這在JPQL中不起作用。 這兩個不同的(SUM -> CASE)
子句奇怪地(至少對我來說我是JPA的新手)相等。所以,我決定從JPQL中拿出原生SQL進行更深入的調查,問題出現在那裏。生成的SQL是這樣的一個:
SELECT t0.Name,
**SUM(CASE WHEN (t1.Direction = 1) THEN 1 ELSE 0 END)** ,
**SUM(CASE WHEN (t1.Direction = 1) THEN 1 ELSE 0 END)** FROM dbo.ZZZ t0,
YYYY t1
WHERE ((((t1.DeviceName IN ('XXXXX'))
AND (t1.DateTime >= {ts '2012-09-24 17:26:48.031'}))
AND (t1.DateTime < {ts '2012-09-24 18:26:48.031'}))
AND (t0.Name = t1.DeviceName)) GROUP BY t0.Name
ORDER BY t0.Name ASC
正如你所看到的,生成的SQL語句是錯誤的前兩行「事業第一SUM,第二個應該是一個接一個,而他們的對面」不是。
我在做一些非常錯誤的事情嗎? JPQL是否支持多重嵌套的CASE和SUM?是否有任何方法可以繞過錯誤(如果是這種情況),而不必直接編寫原生SQL代碼?
感謝與我一樣的想法。 我不認爲編譯/部署時有任何錯誤。我目前直接在eclipse/tomcat上調試應用程序。 可以肯定的是,有沒有「緩存文件」(對不起,但我是JPA的初學者)我必須刪除? 然後將嘗試2.4併發佈一個錯誤,如果有必要。 –