2013-06-01 19 views
0

我在Hibernate中使用JPA,今天我看到了一個奇怪的行爲。Hibernate在內部查詢中使用in子句中的奇怪行爲

下面的查詢工作正常:

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

+0

請小心'IN'列表。數據庫對可能在這些列表中的元素數量施加限制。如果要從SQL語句(子查詢)中生成列表,請特別小心。 –

回答

2

你可能使用的是舊版本的Hibernate,這需要在子句可以寫成

where x.departamento in (:departamentos) 
+0

我使用的是JBoss AS 7自帶的一個。它是4.0.1.Final。你知道這個版本是否有這個要求嗎? – Migore

+0

不是。我考慮過受影響的舊版本的錯誤。也許它已經解決了查詢,但不適用於子查詢。答案是否解決了問題,或者不是? –

+0

是的。謝謝!我試圖做到這一點,但它給了我另一個錯誤(org.hibernate.hql.ast.QuerySyntaxException:意外的AST節點:...)。但是在我解決這個問題後,我可以修復另一個問題。 – Migore

0

您也可以使用自加入以避免嵌套IN列表:

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

謝謝,但這只是一個簡單的案例來顯示問題。該應用程序中的查詢更大,無法用這個技巧解決。 – Migore

相關問題