SQL查询抛出“不在聚合函数或group by子句”异常

时间:2009-02-24 09:17:15

标签: sql hibernate hsqldb dbunit

我正在修复我们的项目的测试套件,该项目正在通过Hibernate / DBUnit进行测试。有几个测试用例都会从Hibernate中抛出类似的异常,看起来像这样:

java.sql.SQLException:不在聚合函数或group by子句中:org.hsqldb.Expression @ 109062e语句[... blah ...]

通过我的谷歌搜索,我怀疑这是由我们使用聚合函数AVG()引起的,因为这是在异常的消息中,并且抛出的所有查询都包含它。但是,我发现了几个链接,这些链接指向获得此错误的人,并且能够通过注释掉“ORDER BY”或“GROUP BY”子句,或者通过在分组中包含SELECT子句中的其他列来修复它。我理解为什么这会修复这样的错误信息,但我不确定它是否适用于我的情况,因为我尝试做同样的事情并没有任何区别。此外,我们有一些测试用例抛出使用ORDER / GROUP的异常,但不是全部。例如:

ThingerVO myThinger = (ThingerVO)session.createQuery("SELECT new ThingerVO(" +
"r.id, " + "u.id, " + "u.alias, " + "s.id, " +
"s.name, " + "r.URL," + "AVG(v.rating), " +
"r.totalCount, " + "r.isPrivate, " + "a.id, " +
"a.name, " + "r.transactionId, " + "r.size, " +
"u.hasPicture " +
") FROM Thinger r LEFT OUTER JOIN r.votes as v, Table1S s " +
"JOIN s.Table2A AS a, User u " +
"WHERE r.userId = u.id AND " +
"s.id = r.Table1SId AND " +
"r.id = :thingId")    
.setInteger("thingId", thingId)
.uniqueResult();

此查询还会导致抛出相同的异常,即使它不使用ORDER / GROUP子句。此外,我将生成的HSQL代码从Hibernate直接剪切/粘贴到MySQL查询浏览器中,并且运行没有问题。此外,值得指出的是,所有这些代码在我们的生产数据库中运行良好,所以我真的很困惑它为什么会抛出这里。

其他一些可能有用的信息 - 我们使用的是扁平的XML数据库结构,其中包含一些用于测试用例的虚拟测试数据,以及用于休眠的MySQL方言。我们正在使用dbunit 2.4.3 / hibernate 3.2.6。我尝试使用最新的hibernate,版本3.3.1,但它的行为相同。

任何指针或提示都将不胜感激。

3 个答案:

答案 0 :(得分:7)

如果在SQL查询的SELECT部分​​中使用聚合函数(例如AVG())以及其他非聚合表达式,则必须具有GROUP BY子句,该子句应列出所有非聚合表达式。

我不熟悉java,但看看代码,看起来它会创建和运行这样的查询(不太对,但我认为足够接近):

SELECT r.id, 
       u.id,
       u.alias,
       s.id, 
       s.name, 
       r.URL, 
       AVG(v.rating), 
       r.totalCount, 
       r.isPrivate, 
       a.id, 
       a.name, 
       r.transactionId,
       r.size, 
       u.hasPicture 
FROM Thinger r 
LEFT OUTER JOIN r.votes as v, 
                     Table1S s 
JOIN s.Table2A AS a, User u 
WHERE r.userId = u.id 
AND s.id = r.Table1SId 
AND r.id = :thingId

...这没有GROUP BY,但确实在SELECT子句中混合了聚合和非聚合表达式。问题是SQL格式错误。

修复方法是在查询结尾添加GROUP BY

我不能说为什么这在你的生产系统中起作用,但我怀疑那里有一些细微的差别。也许有些事情是自动添加GROUP BY

你可以发布它执行的SQL的打印输出吗?

答案 1 :(得分:4)

此外,当order-by字段不是String时,ORDER BY在hsqldb中不起作用。

不幸的是,这导致 Not in aggregate function或group by clause 错误消息,这表明存在分组问题,因此引起混淆......

请参阅:http://markmail.org/message/42vmifme4opz4jgl

答案 2 :(得分:0)

在某些系统(例如TALEND)中,如果有注释行示例,则查询无效:

SELECT r.id,   
   u.alias,
   AVG(v.rating), 
   r.totalCount
FROM Thinger r 
LEFT OUTER JOIN r.votes as v, 
                     Table1S s 
JOIN s.Table2A AS a, User u 
WHERE r.userId = u.id 
AND s.id = r.Table1SId 
AND r.id = :thingId
--AND r.name is not null 
GROUP BY r.id, u.alias, r.totalCount

为MS SQL查询提供错误。而不是评论行

  

-

使用这些符号进行评论

  

/ * AND r.name不为null * /

也许它会帮助别人并节省一些时间。