hibernate HQL非预期AST节点:{vector}

gdx19jrr  于 2023-10-23  发布在  其他
关注(0)|答案(5)|浏览(112)

我试图写一个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要抱怨这个额外的子句?

dm7nw8vv

dm7nw8vv1#

哦,原来我需要将:franchisees括在括号中:

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

zzwlnbp82#

发生这种情况的原因是因为当数组中的数据被放入列表中而不带括号时,从列表中搜索数据库的查询语法将是错误的。

示例:

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-WRONG SYNTAX时,将如下所示。
带括号的查询:from User u where u.id in (:list)
当数据被插入from User u where u.id in (0, 1, 2, 3)-CORRECT SYNTAX时,将如下所示。

4nkexdtk

4nkexdtk3#

我们可以将HQL中的条件“OR”拆分为两个语句。
它工作正常。

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)
yh2wf1be

yh2wf1be4#

因为你漏掉了一些括号,
固定前:

" WHERE ( :status IS NULL OR ( :status IS NOT NULL AND c.caseStatus IN :status ) )"

修复后:

" WHERE ( (:status) IS NULL OR ( (:status) IS NOT NULL AND c.caseStatus IN (:status) ) )"
mbyulnm0

mbyulnm05#

在我的例子中,我得到这个错误是因为我试图检查一个应该是列表的查询参数是否为null(IS NULL),就像这样:

:listParameter IS NULL or p.value IN :listParameter

对我有效的方法是通过传递一个flag参数,将IS NULL检查更改为设置参数的代码部分。此标志参数指示:listParameter是否为null(或空)。
在前面的例子中,当我创建查询时,我会包含flag参数(参见listParameterIsNull):

Query query = em.createQuery("Queries.nameOfTheQuery")
  .setParameter("listParameterIsNull", listParameter == null || listParameter.isEmpty())
  .setParameter("listParameter", listParameter);

查询的部分如下所示:

:listParameterIsNull = TRUE OR p.value IN :listParameter

希望有帮助。

相关问题