【问题标题】:HQL - COUNT(IF()) giving QuerySyntaxException while compilingHQL - COUNT(IF()) 在编译时给出 QuerySyntaxException
【发布时间】:2018-11-27 12:43:17
【问题描述】:

我尝试获取状态等于 ACCEPTED 的 AdmissionForms 的计数,但未能通过此查询进行。

在存储库中,

SELECT COUNT(IF(status='ACCEPTED',1,NULL)), COUNT(IF(status='PENDING',1,NULL)) FROM  admissionforms;

我得到的例外,

org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 16 [SELECT COUNT(if(status = 'ACCEPTED',1,NULL)) FROM admissionforms]

【问题讨论】:

  • (标准)SQL 中没有IF(),我很确定HQL 中也没有ifAS 'ACCEPTED' 也是无效的标准 SQL。标识符不能用单引号括起来。
  • 你需要在休眠中使用CASECASE WHEN status = 'ACCEPTED' THEN 1 ELSE NULL END。但我只会选择COUNT(*) 其中status = 'ACCEPTED'
  • @BackSlash 问题已更新..我发布了单个答案..但是如果需要多个状态值的多个答案怎么办。
  • @a_horse_with_no_name 问题已更新
  • 您想要 SQL 还是 HQL 解决方案?在 SQL 中,它就像 select status, count(*) from admissionforms where status in ('..', ...) group by status 一样简单

标签: java spring jpa hql


【解决方案1】:

为什么不直接包含WHERE 子句呢?

SELECT COUNT(*) AS ACCEPTED 
FROM admissionforms
WHERE status = 'ACCEPTED';

但是,条件聚合也可以这样做:

SELECT SUM(CASE WHEN status = 'ACCEPTED' THEN 1 ELSE 0 END) AS ACCEPTED
FROM admissionforms;

【讨论】:

  • 注意:AS ACCEPTED,不带引号。
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多