2012-09-24 29 views
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代碼?

回答

0

這很奇怪。你確定你的JPQL是否正確並編譯/部署?

你可以試試2.4版嗎?

如果仍然存在,請記錄一個錯誤。

+0

感謝與我一樣的想法。 我不認爲編譯/部署時有任何錯誤。我目前直接在eclipse/tomcat上調試應用程序。 可以肯定的是,有沒有「緩存文件」(對不起,但我是JPA的初學者)我必須刪除? 然後將嘗試2.4併發佈一個錯誤,如果有必要。 –