【问题标题】:HQL unexpected AST node: {vector}HQL 意外 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抱怨那个额外的子句?

【问题讨论】:

    标签: java hibernate grails hql


    【解决方案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) - 正确的语法

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-28
          • 1970-01-01
          • 2021-12-05
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 2018-06-26
          • 1970-01-01
          相关资源
          最近更新 更多