1

我正在为我们的一个项目修复测试套件,该项目正在通过 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 子句。此外,我将 Hibernate 生成的 HSQL 代码直接剪切/粘贴到 MySQL 查询浏览器中,它运行没有问题。此外,值得指出的是,所有这些代码在我们的生产数据库上都可以正常工作,所以我真的很困惑它为什么会在这里抛出。

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

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

4

3 回答 3

7

如果您AVG()在 SQL 查询的 SELECT 部分中使用聚合函数(例如 )以及其他非聚合表达式,那么您必须有一个 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 格式不正确。

解决方法是将 a 添加GROUP BY到查询的末尾。

我不能说为什么这在您的生产系统中有效,但我怀疑那里存在一些细微的差异。也许有些东西正在GROUP BY自动添加?

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

于 2009-02-24T10:47:39.327 回答
4

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

不幸的是,这会导致Not in aggregate function or group by 子句错误消息,这表明存在分组问题,因此会造成混淆......

见: http: //markmail.org/message/42vmifme4opz4jgl

于 2010-01-22T16:18:04.100 回答
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 不为空 */

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

于 2014-03-27T11:41:39.270 回答