gpt4 book ai didi

java - 使用 EclipseLink 将多个 "Select Case"语句聚合到命名查询中

转载 作者:行者123 更新时间:2023-12-03 21:42:09 24 4
gpt4 key购买 nike

我正在使用 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 中取出 native 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?有没有什么方法可以绕过错误(如果是这样)而不必直接编写 native SQL 代码?

最佳答案

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

你能试试 2.4 版本吗?

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

关于java - 使用 EclipseLink 将多个 "Select Case"语句聚合到命名查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12569449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com