我正在使用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代码?
答案 0 :(得分:0)
这很奇怪。你确定你的JPQL是正确的并且编译/部署了吗?
你能试试2.4发布吗?
如果仍然发生,请记录错误。