我正在修复我们的项目的测试套件,正在通过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,但它的行为相同.
任何指针或提示将不胜感激.
如果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格式错误.
修复将添加GROUP BY
到查询的末尾.
我不能说为什么这在你的生产系统中起作用,但我怀疑那里有一些细微的差别.也许是GROUP BY
自动添加的东西?
你可以发布它执行的SQL的打印输出吗?