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的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 意外 AST 节点:围绕“coalesce”

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时

由于意外的 AST 节点,使用 JPA TREAT 的命名查询无法正常工作

HTTP 状态 500 - 意外令牌:,靠近第 1 行,第 129 列

意外令牌:(在 HQL 中