我正在修复我们的项目的测试套件,该项目正在通过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,但它的行为相同。
任何指针或提示都将不胜感激。
答案 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 错误消息,这表明存在分组问题,因此引起混淆......
答案 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 * /
也许它会帮助别人并节省一些时间。