我正在为我们的一个项目修复测试套件,该项目正在通过 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,但它的行为相同。
任何指针或提示将不胜感激。