eclipselink v2.3 を使用して Java コードで簡単なクエリを作成しています。このクエリは、単純に文字列と 2 つの整数を返す必要があります。奇妙なことではないと思いますが、少なくとも次のように考えました。
私が構築しているクエリは次のとおりです。
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);
SQL Server (私たちのネイティブ版) では明らかに機能しますが、JPQL では機能しません。2つの異なる(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
ご覧のとおり、最初の 2 行で生成された SQL ステートメントは間違っています。
私は何か非常に間違ったことをしていますか?JPQL は複数のネストされた CASE と SUM をサポートしていますか? ネイティブ SQL コードを直接記述せずにエラーを回避する方法はありますか (その場合)。