在内部查询中使用in子句的Hibernate奇怪行为

时间:2013-06-01 21:38:38

标签: hibernate jpa

我正在使用JPA和Hibernate,今天我看到了一种奇怪的行为。

以下查询正常工作:

select x.fichaCaracterizacao.id 
from FichaParecer x 
where x.departamento in :departamentos

但是,如果我在内部查询中使用它,则抛出异常,如下所示:

select p.fichaCaracterizacao.id 
from FichaParecer p 
where 1=1 and 
p.id in (select x.fichaCaracterizacao.id 
         from FichaParecer x 
         where x.departamento in :departamentos)

它抛出以下异常:

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: , near line 1, column 244 [select p.fichaCaracterizacao.id from br.ufscar.siga.cadastrosgerais.entity.FichaParecer p where 1=1 and p.id in (select x.fichaCaracterizacao.id from br.ufscar.siga.cadastrosgerais.entity.FichaParecer x where x.departamento in :departamentos0_, :departamentos1_, :departamentos2_)]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1348) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:261) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]

仅当“departamentos”集合有多个项目时才会发生这种情况。

Hibernate是否支持此功能?或者我做错了什么?

编辑:我正在使用Hibernate 4.0.1.Final

2 个答案:

答案 0 :(得分:2)

您可能使用旧版本的Hibernate,它要求将in子句写为

where x.departamento in (:departamentos)

答案 1 :(得分:0)

您还可以使用自联接来避免嵌套的IN列表:

SELECT p1.fichaCaracterizacao.id 
  FROM FichaParecer p1
    INNER JOIN FichaParecer p2
  WHERE p1.id = p2.fichaCaracterizacao.id 
    AND p2.departamento in :departamentos