JPA Union на две коллекции @OneToMany на родительском объекте - PullRequest
1 голос
/ 10 ноября 2011
  • Учетная запись имеет много платежей (paymentType, date)
  • Учетная запись имеет много букв (letterType, date)
  • У вас есть 10 000 учетных записей, каждая из которых имеет не менее 5 платежей и писем.

Каков запрос на возврат всех учетных записей, чьи paymentType = 'check' и lettertype = 'mail'?

Другой способ думать - это сделать два запроса на Payment и Letterи добавить их, но из-за природы API, который я использую (SpringBatch), у меня есть только «Query» в AbstractJpaQueryProvider, поэтому я предпочел бы иметь коллекцию Account для возврата, чем объект, который я затем имеюприведение к свойствам в каждой из служб, использующих этот интерфейс.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Если вы пытаетесь отфильтровать родительские записи на основе некоторых критериев, применяемых к их дочерним записям, может быть лучше использовать выражение «существует», например

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 голос
/ 10 ноября 2011
select a from Account a join a.payments p join a.letters l where p.paymentType='check' and l.letterType='mail'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...