使用
查询HQLselect a from Article a join a.tags t
where t.name in (:tags)
group by a
having count(t)=:tag_count
在Grails中使用HSQLDB会产生SqlException“Not in aggregate function ...”。查看生成的SQL提供
SELECT a.id, a.title, a.url, ....
..
GROUP BY a.id
HAVING ..
在一些MySQL产品中,我听说过,但显然不在HSQLDB中。我不明白:
答案 0 :(得分:1)
刚刚在Hibernate问题跟踪器中找到了this bug。这似乎已经存在了五年的已知问题....令人难以置信。看到基本的东西可以在很长一段时间内被打破,总是令人惊讶。
答案 1 :(得分:0)
生成的SQL不是很正确,因为我们应该在SELECT子句中GROUPBY所有非聚合属性。例如:
SELECT name,category FROM books
GROUP BY category;
上面的查询将给出错误数据,因为它只为一个类别提供1行(即使在MySQL中运行)。相反,它应该这样做:
SELECT name,category FROM books
GROUP BY name,category;
编辑:在进行了一些调查之后,我意识到MySQL是不遵守规则的人。为了查询优化,MySQL确实不允许完整的GROUP BY查询(默认情况下,有一个选项可以关闭此功能)。如果在Oracle或HSQLDB等其他数据库上运行查询,则会出现错误。详细答案可在this question中找到。
EDIT2 :要按照您的方式重新编写查询,除了在Group By
子句中列出所有非聚合选定属性之外,没有其他意思。来自Hibernate doc:
Hibernate目前也没有 扩展分组实体,所以你不能 如果所有属性都按cat编写组 猫是非聚集的。你必须 列出所有非聚合属性 明确。
@Tom:但我认为你可能不需要Article表中的所有字段。如果是这种情况,您是否介意提供有关域类的更多信息以及您要查询的内容,以便我们可以更清楚地看到问题?
答案 2 :(得分:0)
只要ID是主键列,当前SQL Standard实际上允许这种类型的查询。但这被认为是标准的可选功能,不需要数据库引擎支持。
当ID是主键列时,HSQLDB 2.x支持此功能。