2011-09-08 32 views
4

我有4個實體的層次結構是這樣的:限制Hibernate(和JPA)標準的表現力?

   Parent 
        | 
     ------------------------ 
     |   |   | 
    Child1  Child2  Child3 

而且我很感興趣,在單查詢檢索全部用標準Child1和CHILD2的情況下(但不是Child3實例)。

這是很容易與HQL(或JPQL)做如下:

FROM Parent obj 
WHERE obj IN (FROM Child1 where fieldOfChild1="aa") OR 
     obj IN (FROM Child2 where fieldOfChild2=55) 

我已經研究了Hibernate的標準和JPA標準API和我不能找到一種方式來表達這個查詢作爲標準

這是標準的API的限制?還是隻是我錯過了方式?任何提示?

回答

1

如果您在映射中爲每個子類設置了區分值(例如,Child1爲1,Child2爲2,Child3爲3),您可以在HQL/Criteria中使用特殊屬性「class」。

所以條件查詢可能是這樣的:

session.createCriteria(Parent.class) 
     .add(Restrictions.or(Restrictions.eq("class", 1), 
          Restrictions.eq("class", 2))) 

而且你的HQL查詢簡化爲:

FROM parent WHERE class = 1 OR class = 2 
+0

謝謝。我沒有這樣的鑑別者。但無論如何,子查詢可能會引用具體的孩子的其他領域,我只是簡化了問題...... **我更新了問題**來評論這一點。 – edutesoy

-1

好了,你說,你有沒有映射你的類層次結構,您的評論,你有嗎?

因此,無法使用Criteria構建對Child1和Child2的查詢。事實上,我不認爲你的HQL示例工作,因爲父沒有映射。

一個醜陋的解決方案是查詢時間,Child1的Criteria查詢和Child2的另一個Criteria查詢。然後在Java代碼中合併兩個結果列表:( 或映射層次結構:)

+1

當然,它工作,Hibernate檢查類和發現接口。我認爲父母應該像你一樣被映射,當我看到實際上並不需要時,我也感到驚訝。對於2查詢解決方案,我不想在內存中加載所有這些數據,並且僅僅因爲_Criteria功能不夠強大而進行3次查詢。我更喜歡在HQL中做到這一點。我只是想確定它是Criteria的錯,而不是我的:)。無論如何,即使我映射層次結構,它也不會像我在其他答案的評論中所說的那樣工作(我更新了問題以反映這種情況)。謝謝!! – edutesoy