JPA Union在父对象上的两个@OneToMany集合上

时间:2011-11-09 22:18:50

标签: hibernate jpa

  • 帐户有多笔付款(paymentType,date)
  • 帐户有很多字母(letterType,日期)
  • 您有10,000个帐户,每个帐户至少有5个付款和信件。

返回payType ='check'和lettertype ='mail'的所有帐户的查询是什么?

另一种想法是对Payment和Letter做两个查询并添加它们但是由于我正在使用的api(SpringBatch)的性质,我只是暴露在AbstractJpaQueryProvider中的'Query'所以我宁愿返回一个Account集合而不是一个Object,然后我必须将其转换为使用该界面的每个服务中的属性。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您尝试根据应用于其子记录的某些条件过滤父记录,则最好使用“exists”表达式,例如

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