我有2個實體:EntityA和EntityB。Hibernate/JPA:是否可以在單個查詢中檢索異構實體?
它們是不相關的,我不能將它們放在繼承樹中,以解決這個問題範圍以外的一些限制。
但我需要進入相同的JPQL或HQL查詢混合列表包含兩個實體的所有實例。這可能與JPA甚至Hibernate直接?
我需要somethign這樣的:
FROM EntityA WHERE fieldA=1
UNION
FROM EntityB WHERE fieldB="aa"
任何提示?
我有2個實體:EntityA和EntityB。Hibernate/JPA:是否可以在單個查詢中檢索異構實體?
它們是不相關的,我不能將它們放在繼承樹中,以解決這個問題範圍以外的一些限制。
但我需要進入相同的JPQL或HQL查詢混合列表包含兩個實體的所有實例。這可能與JPA甚至Hibernate直接?
我需要somethign這樣的:
FROM EntityA WHERE fieldA=1
UNION
FROM EntityB WHERE fieldB="aa"
任何提示?
嗯,我終於明白了。
它足以使實體實現一個通用接口(甚至不需要在Hibernate中聲明此接口)。
然後,這樣的查詢可以做到:
FROM my.package.CommonInterface obj
WHERE obj IN (FROM EntityA WHERE fieldA=1) OR
obj IN (FROM EntityB WHERE fieldB='a')
這樣,您檢索List<CommonInterface>
。
問題解決。
我對同一主題感興趣。目前我使用兩個查詢(兩個遊標),它們通過criteria.scroll()返回Iterator,然後通過IteratorUtils.chainedIterator()連接兩個迭代器。我想知道,Hibernate如何決定從查詢結果創建哪個對象?由您提供的HQL生成的SQL查詢是什麼? –
對於第一個問題,Hibernate返回CommonInterface的實例,其中一些將是EntityA和EntityB的其他實例的實例。對於你的第二個問題,我不知道所產生的SQL(在這一點上它並不擔心)。 – edutesoy
我快速查看了生成的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)中沒有這方面的信息:( –
最好的事情是執行兩個查詢。
但是如果你必須:
您可以創建一個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)
這是骯髒的,你可能必須要仔細看語法。
問候。
您能否提到由Hibernate從您提供的HQL生成的SQL查詢? –
感謝這個解決方案:在閱讀相應的[Hibernate章節](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select)時我學到了很多東西, 。是否可以「滾動()」生成的查詢?我想,不是... –
簡單的方法是將兩個查詢都連接起來,並將這兩個列表連接在一個'List
謝謝,但正如我評論,我被迫在1查詢中都做,因爲我正在使用分頁,並且我不能分頁獨立querys。 – edutesoy
@edutesoy:如果您使用HQL進行分頁,將無法正常工作:請參閱[Hibernate參考](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html# queryhql多態)。 –