Spring Boot 3.1.4迁移后HQL构造函数查询GROUP BY报错
Spring Boot 3.1.4迁移后HQL分组查询报错解决办法
迁移到Spring Boot 3.1.4后,原有HQL分组查询抛出如下SQL异常:
[SqlExceptionHelper.java:138] ERROR: column "xx.name_of_other_column" must appear in the GROUP BY clause or be used in an aggregate function
问题原因
Spring Boot 3.x默认搭配Hibernate 6.x版本,Hibernate 6对HQL的GROUP BY处理逻辑做了调整,严格遵循SQL标准。旧版本中允许直接通过实体对象(如customClass1)进行分组,但Hibernate 6会将实体对象拆解为对应的表字段,导致实体中未被包含在GROUP BY、也未被聚合函数包裹的字段,触发数据库的标准检查(比如PostgreSQL这类严格执行SQL规范的数据库就会抛出上述错误)。
解决方案
1. 显式指定实体主键作为分组字段
GROUP BY实体本质上是按其主键分组,因此可以直接将实体的主键字段明确写在GROUP BY子句中。如果是复合主键,需列出所有主键字段。
修改后的查询示例:
@Query(""" SELECT new com.xx.xx.xx.MyClassWrapper( customClass1, max(lpd.fieldA), max(lpd.fieldB), max(lpd.fieldC), max(lpd.fieldD) ) FROM customClass2 AS lpd JOIN customClass1 AS customClass1 ON lpd.fieldName = customClass1.id GROUP BY customClass1.id """)
这种方式能让Hibernate生成符合SQL标准的分组语句,彻底解决报错问题。
2. 临时开启Hibernate兼容模式(不推荐长期使用)
如果需要快速适配旧代码,可通过配置放宽Hibernate对GROUP BY的检查,但此方式可能隐藏SQL规范问题,仅建议作为过渡方案:
在application.properties中添加:
spring.jpa.properties.hibernate.sql.group_by_handling=legacy
或:
spring.jpa.properties.hibernate.query.group_by_aware_distinct=false
内容的提问来源于stack exchange,提问作者Amir Choubani
相关产品推荐
相关产品推荐

