如何在Hibernate的JPQL中使用SUM(CASE WHEN...)聚合查询?
问题结论
JPQL从JPA 2.0版本开始就原生支持在SUM、COUNT等聚合函数内嵌套CASE WHEN语句,不需要使用原生SQL查询。
报错原因排查
你遇到的语法错误大概率是写法兼容性问题,常见触发原因如下:
- 多余括号问题:你当前代码里CASE表达式外层多套了一层不必要的括号,部分JPA实现(比如早期版本Hibernate)对多层括号的解析兼容度较差,会误判为语法错误。
- 布尔判断写法不兼容:部分JPA实现不支持直接写
mt.prop1 = true,换成JPQL标准的mt.prop1 IS TRUE写法兼容性更好。 - 框架版本过旧:如果使用的是Hibernate 5.x以下、EclipseLink 2.4以下的旧版本,确实存在聚合函数嵌套CASE的支持bug,升级到稳定新版本即可解决。
修正后的代码示例
Query qQuery = entityManager.createQuery("select " + " sum(case when mt.prop1 is true then 1 else 0 end), " + " sum(case when mt.prop2 is true then 1 else 0 end), " + " sum(case when mt.prop3 is false then 1 else 0 end), " + " sum(case when mt.prop3 is true then 1 else 0 end) " + "from MyTable mt " + "where mt.id = :myId ");
补充说明
如果调整写法后仍报错,可以优先排查实体类属性映射是否和数据库字段匹配、语句内是否有拼写错误,排除语法之外的问题。
内容的提问来源于stack exchange,提问作者billshortz
相关产品推荐
相关产品推荐

