3

我正在使用 eclipselink v2.3 在我的 java 代码中编写一个简单的查询。这个查询必须简单地返回一个字符串和两个整数,我认为这没什么奇怪的,或者至少我认为,

我正在构建的查询如下:

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 中不起作用。奇怪的是,这两个不同的(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 和第二个 SUM 应该是相反的,而它们不是。

我做错了什么吗?JPQL 是否支持多个嵌套的 CASE 和 SUM?有没有办法绕过错误(如果是这样的话)而不必直接编写本机 SQL 代码?

4

1 回答 1

0

这很奇怪。您确定您的 JPQL 正确且已编译/部署吗?

你可以试试2.4版本吗?

如果仍然出现,请记录错误。

于 2012-09-25T14:06:55.537 回答