使用EclipseLink将多个“Select Case”语句放入Aggregate Named Query中

时间:2012-09-24 16:49:35

标签: java jpa eclipselink case jpql

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

我正在构建的查询如下:

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和第二个应该是一个与另一个相反,而它们不是。

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

1 个答案:

答案 0 :(得分:0)

这很奇怪。你确定你的JPQL是正确的并且编译/部署了吗?

你能试试2.4发布吗?

如果仍然发生,请记录错误。