Grails:HQL查询中的“不在聚合函数中”问题

时间:2011-03-31 06:47:20

标签: hibernate grails hql hsqldb

使用

查询HQL
select 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中。我不明白:

  1. 为什么Hibernate会生成错误的SQL?或者不是吗?
  2. 为什么HSQLDB在选择批次时不允许对 id进行分组,我的意思是它毕竟是主键,而我的SELECT不会引入不确定的值,例如随机或当前时间< / LI>

3 个答案:

答案 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支持此功能。