Как объединить три таблицы с помощью Spring JPA - PullRequest
0 голосов
/ 30 августа 2018

Мне нужна помощь с Spring JPA.

У меня есть идентификатор, который приходит по запросу, и мне нужно получить 2 поля - itemsOrdered, itemsDelivered из 2 таблиц.

Соотношение между этими таблицами не является простым, как указано ниже. enter image description here

Таблица A имеет идентификатор (из запроса) в качестве PK. Таблица A имеет отношение внешнего ключа к таблице B. Таблица B имеет отношение внешнего ключа к таблице C, таблице D.

Прямо сейчас, чтобы читать элементы заказано, элементы доставлены, я делаю это один за другим.

A a = CrudRepository.findOne(id from request);
B b = CrudRepository.findOne(A.getID());
C c = CrudRepository.findOne(B.getID());
D d = CrudRepository.findOne(B.getID());

Можно ли в любом случае выполнить объединение, чтобы я мог получить C.itemsOrdered и d.itemsDelivered за один шаг?

1 Ответ

0 голосов
/ 30 августа 2018

Если вы используете Hibernate 5.1+ (или просто Spring Boot 2.0+), вы можете использовать «объединение с условиями» в JPQL запросах, как в обычном SQL, например:

select 
  c.itemsOrdered, 
  d.itemsDelivered 
from 
  A a 
  join B b on b.a_id = a.id 
  join C c on c.b_id = b.id 
  join D d on d.b_id = b.id 
where 
  a.id = ?1

И с помощью проекций вы можете легко получить эти поля:

public interface TwoFieldsProjection {
   Long getItemsOrdered();
   Long getItemsDelivered(); 
}

@Query("select c.itemsOrdered as itemsOrdered, d.itemsDelivered as itemsDelivered from A a join B b on b.a_id = a.id join C c on c.b_id = b.id join D d on d.b_id = b.id where a.id = ?1")
Optional<TwoFieldsProjection> getTwoFields(Long aId);

Обратите внимание на использование в вашем запросе псевдонимов (c.itemsOrdered as itemsOrdered), имена которых должны совпадать с геттерами в проекции.

...