HQL 意外 AST 节点:vector
Posted
技术标签:
【中文标题】HQL 意外 AST 节点:vector【英文标题】:HQL unexpected AST node: vectorHQL 意外 AST 节点:vector 【发布时间】:2014-08-24 10:16:51 【问题描述】:我正在尝试编写一个 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抱怨那个额外的子句?
【问题讨论】:
【参考方案1】:哦,原来我需要将:franchisees
括在括号中:
from User u where
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in (:franchisees))
and u.parentOrganisation.deleted = false
and u.active = true
【讨论】:
【参考方案2】:我们可以将 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)
【讨论】:
【参考方案3】:之所以会出现这种情况,是因为当数组中的数据不带括号放入列表时,从列表中搜索数据库的查询语法会出错。
示例:
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)
- 正确的语法。
【讨论】:
以上是关于HQL 意外 AST 节点:vector的主要内容,如果未能解决你的问题,请参考以下文章
org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH
org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时
由于意外的 AST 节点,使用 JPA TREAT 的命名查询无法正常工作