You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:00:00