含GROUP BY的自定义JPQL查询分页时别名未知报错如何解决?
报错原因
使用Page作为返回值且Pageable设置了size参数时,Spring Data JPA会自动生成统计总条数的count查询,自动生成的count查询不会保留原SELECT子句中定义的别名对应的计算逻辑,仅直接复用了GROUP BY week的逻辑,导致数据库找不到未定义的week字段。未设置size时不会触发自动count查询,因此不会报错。
注意:你提供的原JPQL代码中,
week别名和COUNT(r.id)之间遗漏了逗号,实际使用时需要补上,否则会直接报JPQL语法错误。
解决方案
方案1:GROUP BY直接使用完整表达式(最简便)
直接将GROUP BY后的别名替换为实际的计算表达式,自动生成的count查询会直接复用该表达式,不会出现字段找不到的问题:
@Query(value = "SELECT EXTRACT(WEEK FROM e.time) AS week, " + "COUNT(r.id) AS total FROM MyEntity e " + "LEFT JOIN e.relationship r GROUP BY EXTRACT(WEEK FROM e.time)") Page<WeeklyReport> findWeeklyReport(Pageable pageable);
方案2:手动指定count查询
在@Query注解中新增countQuery属性,手动定义count查询逻辑,避免自动生成的查询缺失字段定义:
@Query( value = "SELECT EXTRACT(WEEK FROM e.time) AS week, COUNT(r.id) AS total FROM MyEntity e " + "LEFT JOIN e.relationship r GROUP BY week", countQuery = "SELECT COUNT(DISTINCT EXTRACT(WEEK FROM e.time)) FROM MyEntity e LEFT JOIN e.relationship r" ) Page<WeeklyReport> findWeeklyReport(Pageable pageable);
两种方案都可以完整保留原有业务逻辑,不需要修改返回值和分页参数逻辑。
内容的提问来源于stack exchange,提问作者saulotoledo
相关产品推荐
相关产品推荐

