Множественное объединение, чтобы исключить результаты в первом соединении, которые есть во втором

#spring-boot #jpa #spring-data-jpa

#весенняя загрузка #jpa #spring-data-jpa

Вопрос:

Я использую Spring JPA. У меня есть объект транзакций, транзакция, которую необходимо оплатить. Эти выплаты записываются в другой объект выплаты, PayoutTransaction. Они связаны отношением ManyToMany. Иногда выплаты завершаются неудачно, и они повторяются, добавляя новую запись PayoutTransaction, которая обычно в порядке. Мне нужно получить транзакции с неудачной выплатой, но исключая те неудачные транзакции, которые также имеют выплату OK, поскольку они были успешно оплачены, даже если они потерпели неудачу с первой попытки (у них есть другая запись в объекте PayoutTransaction со статусом OK). Я пробовал это с множественным объединением между обеими таблицами, но оно включает транзакции, даже если они имеют нормальную выплату. (Что, я знаю, является ожидаемым поведением) Как я могу это решить?

 SELECT distinct t FROM Transaction t JOIN t.payoutTransactions p JOIN t.payoutTransactions p2 where p.status = 'FAILED' and NOT p2.status = 'OK'
  

Ответ №1:

Вы можете попробовать EXISTS здесь,

 SELECT distinct t FROM Transaction t JOIN t.payoutTransactions p
where p.status = 'FAILED' AND exists (SELECT p2
 payoutTransactions p2 where p2.status = p.status and p2.status <> 'OK')
  

Или вы могли бы даже написать собственный запрос, как показано ниже,

 SELECT t.* FROM Transaction t join payoutTransaction p on t.ID = p.ID
 where p.status = 'FAILED' AND exists 
(SELECT 1 FROM payoutTransaction p2 where p2.status = p.status and p2.status <> 'OK' )
  

Комментарии:

1. Привет @Govind. Разве это не должно быть «И НЕ существует …», учитывая, что я хочу получить неудачную выплату, у которой нет выплаты OK?