sql - 选择 H2 数据库要求按列分组的案例
问题描述
当我使用 HQL 查询我的数据库时,此请求工作正常并返回良好的数据:
select
case
when activityjp0_.status<>'CLOSED'
and (activityjp0_.user_id is null) then 'UNASSIGNED'
else case
when activityjp0_.status<>'CLOSED'
and activityjp0_.deadline<CURRENT_DATE then 'OVERDUE'
else case
when activityjp0_.status='PENDING' then 'IN_PROGRESS'
else activityjp0_.status
end
end
end as col_0_0_,
count(distinct activityjp0_.id) as col_1_0_
from
activities activityjp0_
group by
case
when activityjp0_.status<>'CLOSED'
and (activityjp0_.user_id is null) then 'UNASSIGNED'
else case
when activityjp0_.status<>'CLOSED'
and activityjp0_.deadline<CURRENT_DATE then 'OVERDUE'
else case
when activityjp0_.status='PENDING' then 'IN_PROGRESS'
else activityjp0_.status
end
end
end
当我使用 Criteria API 生成 SAME 请求时,它给出:
select
case
when activityjp0_.status<>?
and (activityjp0_.user_id is null) then 'UNASSIGNED'
else case
when activityjp0_.status<>?
and activityjp0_.deadline<? then 'OVERDUE'
else case
when activityjp0_.status=? then 'IN_PROGRESS'
else activityjp0_.status
end
end
end as col_0_0_,
count(distinct activityjp0_.id) as col_1_0_
from
activities activityjp0_
group by
case
when activityjp0_.status<>?
and (activityjp0_.user_id is null) then 'UNASSIGNED'
else case
when activityjp0_.status<>?
and activityjp0_.deadline<? then 'OVERDUE'
else case
when activityjp0_.status=? then 'IN_PROGRESS'
else activityjp0_.status
end
end
end
但是这会导致 JDBC 错误声明:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "ACTIVITYJP0_.USER_ID" must be in the GROUP BY list; SQL statement:
选择activityjp0_.status<>时的情况?和 (activityjp0_.user_id 为空) 然后是 'UNASSIGNED' 否则当 activityjp0_.status<>? 和activityjp0_.deadline?和 (activityjp0_.user_id 为空) 然后是 'UNASSIGNED' 否则当 activityjp0_.status<>? 和活动jp0_.deadline
如果我在同一个生成的查询中替换变量,并针对我的数据库(在 h2 控制台中)运行它,它运行时没有错误
这怎么可能 ?
解决方案
你有两个非常相似的表达式:
case
when activityjp0_.status<>?
and (activityjp0_.user_id is null) then 'UNASSIGNED'
else case
when activityjp0_.status<>?
and activityjp0_.deadline<? then 'OVERDUE'
else case
when activityjp0_.status=? then 'IN_PROGRESS'
else activityjp0_.status
end
end
end
但实际上它们并不相同,因为参数 ( ?
) 都是不同的;第一个表达式中有 4 个参数,第二个表达式中有 4 个附加参数。您应该使用group by col_0_0_
代替,group by case … end
或者您可以在两个表达式中使用相同的索引 ( ?1
, ?2
, ...) 参数。
推荐阅读
- c# - 如何使用 EF Core 2.1.0 和代理进行延迟加载
- php - MySql 事件,每天更新并根据其内容更改数据库中的某些项目
- firebase - 为什么 Flutter 一直尝试匿名登录用户?
- java - 创建 Spring Data JPA 存储库时遇到问题
- php - 为什么我的日志文件会重写前一个文件而不是附加到文件中?
- cucumber - 在我的黄瓜步骤定义中使用环境变量
- javascript - 使用 ajax php 和 mariadb 进行动态选择
- javascript - Javascript Object.entries 索引问题
- javascript - JSON 中位置 0 的意外标记 u(但仅有时)
- javascript - 仅接受来自授权 URL 的请求