HQL意外的AST节点:{vector}

时间:2014-07-03 10:26:22

标签: java hibernate grails hql

我试图编写一个HQL查询来获取属于特定组织的用户列表,或者来自特许经营者列表中的任何特许经营者,但是hibernate无法解析它。我无法弄清楚原因。这是HQL:

from User u where 
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees) 
and u.parentOrganisation.deleted = false 
and u.active = true

这是hibernate吐出的错误:

unexpected AST node: {vector} [from com.myapp.User u where (u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees0_, :franchisees
1_, :franchisees2_) and u.parentOrganisation.deleted = false and u.active = true]. Stacktrace follows:
Message: unexpected AST node: {vector} [from com.myapp.User u where (u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees0_, :fr
anchisees1_, :franchisees2_) and u.parentOrganisation.deleted = false and u.active = true]

如果我取出or u.parentOrganisation in :franchisees位,那么我的查询如下所示:

from User u where 
(u.parentOrganisation = :topLevelOrganisation) 
and u.parentOrganisation.deleted = false 
and u.active = true

然后它工作正常。我的语法有什么问题?为什么hibernate会抱怨这个额外的子句?

3 个答案:

答案 0 :(得分:27)

哦,事实证明我需要将:franchisees括在括号中:

from User u where 
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in (:franchisees)) 
and u.parentOrganisation.deleted = false 
and u.active = true

答案 1 :(得分:2)

发生这种情况的原因是,当将数组中的数据放在列表中而没有括号时,用于从列表中搜索数据库的查询语法将是错误的。

示例:

List<Integer> userIdList = [0, 1, 2, 3]

不带括号的查询:from User u where u.id in :list

插入数据from User u where u.id in 0, 1, 2, 3-错误的语法时,

看起来像这样。

带括号的查询:from User u where u.id in (:list)

插入数据from User u where u.id in (0, 1, 2, 3)-正确的语法时,

看起来像这样。

答案 2 :(得分:1)

我们可以将HQL中的条件“OR”拆分为2个语句。

工作正常。

from User u where 
(u.parentOrganisation = :topLevelOrganisation and u.parentOrganisation.deleted = false 
and u.active = true ) 
or (u.parentOrganisation in (:franchisees) and u.parentOrganisation.deleted = false 
and u.active = true) 
相关问题