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

HQL中joined继承映射实体执行group by不生效问题咨询

首先明确结论:你的操作没有问题,这是Hibernate 5.x版本处理JOINED继承策略实体GROUP BY操作的已知缺陷。

问题原因

当你在HQL中声明group by 实体时,Hibernate本应自动将该实体查询所需的所有非聚合字段都加入SQL的GROUP BY子句中,但对于使用JOINED继承策略的实体,5.x版本的逻辑只会将子类对应的表主键加入GROUP BY,不会遍历继承层级,把父类表中需要查询的字段也加入GROUP BY,就会出现你遇到的expression not in aggregate or GROUP BY columns报错。
你观察到的继承策略、关联字段类型的差异表现也符合这个缺陷的特征:

  • TABLE_PER_CLASS策略所有字段都存在同一张表,Hibernate能正确拉取所有需要分组的字段,因此可以正常执行
  • 当关联字段类型为父类SuperA时,Hibernate同样不会遍历继承层级拉取所有字段,因此不管用什么继承策略都会触发报错

可行解决方案

  1. 手动指定分组字段
    不用直接按整个实体分组,将你需要返回的实体字段显式写到SELECT和GROUP BY中,示例HQL如下:
select a.id, a.superData, a.subData, count(r) 
from Root r join r.a a 
group by a.id, a.superData, a.subData

查询返回的结果可以自行封装为DTO对象,或者手动构造SubA/SuperA实例。

  1. 升级Hibernate版本
    该分组逻辑缺陷在Hibernate 6.0及以上稳定版本已经修复,升级后原有group by 实体的HQL可以正常执行,生成的SQL会自动包含继承层级所有需要分组的字段。

  2. 临时兼容方案(不推荐)
    如果你使用MySQL数据库且无法做上述调整,可以临时关闭数据库的ONLY_FULL_GROUP_BY参数绕过校验,但该方案不符合SQL标准,可能出现不可预期的查询结果,仅建议临时调试使用。


内容的提问来源于stack exchange,提问作者Mateus Sarmento

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:04