Java Hibernate问题:必须出现在GROUP BY子句中或用于聚合函数

Java Hibernate问题:必须出现在GROUP BY子句中或用于聚合函数,java,sql,database,hibernate,postgresql,Java,Sql,Database,Hibernate,Postgresql,我要运行的查询: SELECT date_trunc('month',UA.activity_date),SUM(UA.points) FROM user_activity UA WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' GROUP BY date_trunc('month',UA.activity_date) ORDER BY date_trunc('month',UA.ac

我要运行的查询:

SELECT date_trunc('month',UA.activity_date),SUM(UA.points) FROM user_activity UA
WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' 
GROUP BY date_trunc('month',UA.activity_date)
ORDER BY date_trunc('month',UA.activity_date)
当我使用Hibernate运行该查询时,抛出以下错误:

ERROR: column "useractivi0_.activity_date" must appear in the GROUP BY clause or be used in an aggregate function
为了解决这个问题,我将上述查询修改为:

SELECT date_trunc('month',UA.activity_date),SUM(UA.points) FROM user_activity UA
WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' 
GROUP BY date_trunc('month',UA.activity_date),***UA.activity_date***
ORDER BY date_trunc('month',UA.activity_date)
我怎样才能解决这个问题


当我直接在db上运行来自toad shell的第一个查询时,它似乎工作得很好。但是,当我使用Hibernate从代码中运行相同的查询时,我得到了该错误。

您可以尝试在子查询中使用您的总和和日期,如下所示:

SELECT colA, SUM(colB) FROM (SELECT date_trunc('month',UA.activity_date) colA,SUM(UA.points) colB FROM user_activity UA
WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' 
GROUP BY UA.activity_date
ORDER BY date_trunc('month',UA.activity_date))sub GROUP BY colA

只需在outerquery中再次执行分组。看看是否有帮助。

您能显示Hibernate生成的查询吗?使用Hibernate运行查询是什么意思?您是使用本机SQL还是使用HQL?我在问题中看到的只是一堆SQL,没有HQL。我使用的是HQL,这是hibernate查询生成的查询:[选择日期:aggregateBy,UA.date,SUMUA.points FROM UserActivity UA,其中UA.date>:fromDate和UA.date<:toDate GROUP by date\u trunc:aggregateBy,UA.date,UA.date ORDER by date\u trunc:aggregateBy,UA.date]我必须在GROUPBY子句中输入UA.date以使查询正常工作,但我真的不想这样做结果不是我期望的结果不像hibernate那样:org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:靠近第1行,第29列[从选择日期中选择colA、SUMcolB\u trunc:aggregateBy、UA.date colA、SUMUA.points colB从com.MWBFServer.Activity.UserActivity UA中选择,其中UA.date>:fromDate和UA.date<:toDate按UA.date分组按日期排序\u trunc:aggregateBy、UA.datesub分组按colA]字符串hql=从选择日期中选择colA,SUMcolB\u trunc:aggregateBy,UA.date colA,SUMUA.points colB FROM UserActivity UA;hql+=其中UA.date>:fromDate和UA.date<:toDate;hql+=根据UA.date分组;hql+=根据日期排序\u trunc:aggregateBy,UA.datesub根据colA分组;查询=会话。CreateQueryHl;无法将sql查询传递给createQuery,您需要使用createSQLQuery。createQuery用于HQL。在您的情况下,将其更改为session.createSQLQureyhql;我确实希望使用hibernate查询语言使代码在dbs中更具可移植性。因此,使用常规createQuery代替createSQLQuery,使用类名和属性名,而不是表名和列名名称。但是Hibernate抱怨上面的错误。有没有办法不使用createSQLQuery来执行此操作?然后您需要将sql查询转换为HQL查询。请查看以了解如何在HQL中构建子查询
SELECT date_trunc('month',UA.activity_date) act_date,
       SUM(UA.points) point_sum 
FROM user_activity UA
WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' 
GROUP BY act_date
ORDER BY act_date
SELECT colA, SUM(colB) FROM (SELECT date_trunc('month',UA.activity_date) colA,SUM(UA.points) colB FROM user_activity UA
WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' 
GROUP BY UA.activity_date
ORDER BY date_trunc('month',UA.activity_date))sub GROUP BY colA
SELECT date_trunc('month',UA.activity_date) act_date,
       SUM(UA.points) point_sum 
FROM user_activity UA
WHERE UA.activity_date > '01/01/2014' AND UA.activity_date < '12/31/2014' 
GROUP BY act_date
ORDER BY act_date