3

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 コードを直接記述せずにエラーを回避する方法はありますか (その場合)。

4

1 に答える 1

0

それは非常に奇妙です。JPQLが正しく、コンパイル/デプロイされていますか?

2.4 リリースを試すことはできますか?

それでも発生する場合は、バグを記録してください。

于 2012-09-25T14:06:55.537 に答える