2011-09-06 22 views
3

我有2個實體:EntityA和EntityB。Hibernate/JPA:是否可以在單個查詢中檢索異構實體?

它們是不相關的,我不能將它們放在繼承樹中,以解決這個問題範圍以外的一些限制。

但我需要進入相同的JPQL或HQL查詢混合列表包含兩個實體的所有實例。這可能與JPA甚至Hibernate直接?

我需要somethign這樣的:

FROM EntityA WHERE fieldA=1 
UNION 
FROM EntityB WHERE fieldB="aa" 

任何提示?

+1

簡單的方法是將兩個查詢都連接起來,並將這兩個列表連接在一個'List '中。 – toto2

+0

謝謝,但正如我評論,我被迫在1查詢中都做,因爲我正在使用分頁,並且我不能分頁獨立querys。 – edutesoy

+0

@edutesoy:如果您使用HQL進行分頁,將無法正常工作:請參閱[Hibernate參考](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html# queryhql多態)。 –

回答

5

嗯,我終於明白了。

它足以使實體實現一個通用接口(甚至不需要在Hibernate中聲明此接口)。

然後,這樣的查詢可以做到:

FROM my.package.CommonInterface obj 
WHERE obj IN (FROM EntityA WHERE fieldA=1) OR 
     obj IN (FROM EntityB WHERE fieldB='a') 

這樣,您檢索List<CommonInterface>

問題解決。

+0

我對同一主題感興趣。目前我使用兩個查詢(兩個遊標),它們通過criteria.scroll()返回Iterator,然後通過IteratorUtils.chainedIterator()連接兩個迭代器。我想知道,Hibernate如何決定從查詢結果創建哪個對象?由您提供的HQL生成的SQL查詢是什麼? –

+0

對於第一個問題,Hibernate返回CommonInterface的實例,其中一些將是EntityA和EntityB的其他實例的實例。對於你的第二個問題,我不知道所產生的SQL(在這一點上它並不擔心)。 – edutesoy

+0

我快速查看了生成的SQL。它不是可選的,因爲Hibernate會生成2個查詢:'SELECT EntityA。* WHERE id IN(SELECT EntityA.id ... WHERE fieldA = 1)或id IN(SELECT EntityB.id ... WHERE fieldB ='a')'和'SELECT EntityB。* WHERE id IN(SELECT EntityB.id ... WHERE fieldB ='a')OR ID IN(SELECT EntityA.id ... WHERE fieldA = 1)'。顯然,每個查詢中的第二個子查詢是錯誤的(至少在我的情況下)。 [Hibernate docu](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-polymorphism)中沒有這方面的信息:( –

2

最好的事情是執行兩個查詢。

但是如果你必須:

您可以創建一個POJO對它們進行檢索:

class EntityAandEntityB { 
    EntityA a; 
    EntityB b; 
    long idA; 
    long idB; 
    int fieldA; 
    String fieldB; 

    public EntityAandEntityB(long idA, long IdB, int fieldA, String fieldB) { 
     this.a = new EntityA(idA, fieldA); 
     this.b = new EntityB(idB, fieldB); 
    } 
} 

然後將查詢將是:

select new package.EntityAandEntityB(a.idA, a.fieldA, b.idB, b.fieldB) from ( 
    (select idA, fieldA from EntityA) a 
UNION 
    (select idB, fieldB from EntityB) b) 

這是骯髒的,你可能必須要仔細看語法。

問候。

+0

您能否提到由Hibernate從您提供的HQL生成的SQL查詢? –

+0

感謝這個解決方案:在閱讀相應的[Hibernate章節](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select)時我學到了很多東西, 。是否可以「滾動()」生成的查詢?我想,不是... –

相關問題