2011-11-09 51 views
1
  • 帳戶上的兩個@OneToMany收藏有許多付款(paymentType,日期)
  • 帳戶有很多信件(letterType,日期)
  • 有10,000個賬戶,每個賬戶具有至少5付款和信件。

什麼查詢返回paymentType ='check'和lettertype ='mail'的所有帳戶?JPA聯盟的父對象

另一種想法是在支付和信函上進行兩個查詢並添加它們,但由於我使用的api的性質(SpringBatch),我只接觸到AbstractJpaQueryProvider中的「查詢」所以我寧願讓一個Account集合被返回,而我必須將其轉換爲使用此接口的每個服務中的屬性。

回答

1

如果你試圖篩選基於應用到他們的孩子記錄一些標準的父記錄,這可能是最好使用一個「存在」的表情,像

select a from Account 
where exists(select p from Payment where p.account = a and p.paymentType='check') 
and exists(select l from Letters l where l.account = a and l.letterType='mail') 

這將避免多個@OneToMany在單個查詢中加入導航引入的笛卡爾連接問題。

參見: http://download.oracle.com/docs/cd/E16764_01/apirefs.1111/e13046/ejb3_langref.html#ejb3_langref_exists

1
select a from Account a join a.payments p join a.letters l where p.paymentType='check' and l.letterType='mail' 
+0

感謝。事實證明,我實際上需要支付和信函的「聯合」,因此查詢需要在集合對象級別運行。什麼是上面的等價物? – pritam