Hibernate 列“user1_.user_id”必须出现在 GROUP BY 子句中或在聚合函数中使用

Posted

技术标签:

【中文标题】Hibernate 列“user1_.user_id”必须出现在 GROUP BY 子句中或在聚合函数中使用【英文标题】:Hibernate column "user1_.user_id" must appear in the GROUP BY clause or be used in an aggregate function 【发布时间】:2013-04-16 03:14:55 【问题描述】:

我正在尝试在 hibernate 中编写一个简单的查询,在该查询中,我只获得了得分最高的用户的降序列表。基本上我正在尝试编写此查询select user_id from user_points group by user_id order by sum(points) desc。这适用于我正在处理的 Postgres 数据库。

我有以下 HSQL 查询 select c.user from UserPoints c group by c.user order by sum(c.points) desc。 Points 表有一个名为 user_id 的列,它引用用户表。在我们的映射中,user_id 被映射到一个 User 类。

但是,当我运行此查询时,我得到列“user1_.user_id”必须出现在 GROUP BY 子句中或用于聚合函数中。我尝试搜索类似的问题,但只是真正想出了这个:JPA Query/Hibernate: Column must appear in the GROUP BY clause or be used in an aggregate function 没有答案。

我有点坚持使用 HQL,因为我需要做的另一件事是加入一个没有映射关联(但也有一个 user_id 键)的表。我也试图尽可能快地保持这个查询。任何帮助都会非常感激,因为我真的很困惑为什么这不起作用。

【问题讨论】:

select c.user from UserPoints p group by p.user order by sum(c.points) desc - 我看不到别名 c 的类? 在您的查询中,“c”指的是什么? 抱歉,我的问题输入错误,应该是 c.user 的 UserPoints c 组 你也应该发布你的实体类。 【参考方案1】:

所以我想我可能已经找到了问题所在。我们实际上有两个到 user_id 列的映射。一个是一个属性,其中我们将 user_id 作为常规 long,另一个是多对一映射,我们将其映射到用户类。我将日志记录级别设置为调试,因此我可以看到休眠正在创建的查询,并且似乎它正在使用将 select c.user 转换为用户表中的所有列(这意味着它正确使用了多对一映射),但由于某些原因,在 group by 子句中,它将 c.user 转换为 user_id 属性。由于我无法更改映射并且我的截止日期很紧,我选择只编写一个常规 SQL 查询来获取用户 ID,然后运行另一个条件查询来获取该 ID 列表中的所有用户。

【讨论】:

以上是关于Hibernate 列“user1_.user_id”必须出现在 GROUP BY 子句中或在聚合函数中使用的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate @OneToOne 映射不加入列?

Hibernate:本机 SQL 查询重复列结果

Hibernate - 有没有办法加入 2 列反对 1?

org.hibernate.HibernateException:缺少列

Hibernate:当没有物理列或值用于区分实例时,鉴别器列如何工作?

Hibernate 查询目标列顺序