JPA: Как получить дочерние объекты одного объекта с идентификатором другого объекта в отношениях «многие ко многим»? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть отношение многие ко многим от сущности к себе.

@Entity
@Table(name = "MERCHANTS")
public class Merchant {

  @Id
  @GeneratedValue
  private long id;

  @OneToMany(mappedBy = "merchant", fetch = FetchType.EAGER)
  @Fetch(FetchMode.SELECT)
  private List<Service> services;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(name = "SUB_MERCHANTS", joinColumns = { @JoinColumn(name = "merchant_id") }, inverseJoinColumns = { @JoinColumn(name = "submerchant_id") })
  private final Set<Merchant> submerchants = new HashSet<>();

  @ManyToMany(mappedBy = "submerchants")
  private final Set<Merchant> merchants = new HashSet<>();

}

Другими словами, торговец может иметь много подводников. Каждый продавец может иметь ноль, одну или несколько услуг.

@Entity
@Table(name = "SERVICES")
public class Service {

  @Id
  @GeneratedValue
  private long id;

  @ManyToOne
  @JoinColumn(name = "merchant_id")
  private Merchant merchant;

  // ...

}

Следующий запрос предоставит мне все услуги продавца, учитывая его идентификатор.

SELECT s FROM Service s WHERE s.merchantId = :merchantId ORDER BY s.name ASC

Если у этого торговца есть субторговцы, как я могу также включить услуги каждого субмерчанта в результаты?

1 Ответ

1 голос
/ 12 апреля 2019

Этот HQL-запрос должен вернуть нужные вам результаты:

SELECT s from Service s where s.id in 
(SELECT sm_s.id FROM Merchant m JOIN m.submerchants sm JOIN sm.services sm_s WHERE m.id = :merchantId) 
or s.id in 
(select ms.id from Merchant m2 JOIN m2.services ms WHERE m2.id = :merchantId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...