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同样不会遍历继承层级拉取所有字段,因此不管用什么继承策略都会触发报错
可行解决方案
- 手动指定分组字段
不用直接按整个实体分组,将你需要返回的实体字段显式写到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实例。
升级Hibernate版本
该分组逻辑缺陷在Hibernate 6.0及以上稳定版本已经修复,升级后原有group by 实体的HQL可以正常执行,生成的SQL会自动包含继承层级所有需要分组的字段。临时兼容方案(不推荐)
如果你使用MySQL数据库且无法做上述调整,可以临时关闭数据库的ONLY_FULL_GROUP_BY参数绕过校验,但该方案不符合SQL标准,可能出现不可预期的查询结果,仅建议临时调试使用。
内容的提问来源于stack exchange,提问作者Mateus Sarmento
相关产品推荐
相关产品推荐

