Учитывая, что у нас есть следующие объекты, которые формируют отношение многие ко многим:
@Entity
public class A {
@Id
private Long id;
private String name;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name = "A_B",
joinColumns = @JoinColumn(name = "id_a"),
inverseJoinColumns = @JoinColumn(name = "id_b"))
private Set<B> listing;
}
@Entity
public class B {
@Id
private Long id;
}
Мне нужно написать запрос, который выбирает B и применяет некоторые критерии WHERE
на стороне A . Так как Relationship моделируется со стороны A сущности, очень легко написать запрос, который сам объединяет их:
new JPAQuery<>(entityManager)
.select(QB.b)
.from(QA.a)
.join(QA.a.listing,b)
.where(QA.a.name.eq("test"))
.fetch();
Однако, так как таблица A_B
может дублироваться, этот запрос может привести к повторяющиеся записи, что не подходит для моего сценария. Поэтому вместо этого мне нужно запустить FROM
B
и JOIN
A
. И здесь мне нужна помощь. Я попытался:
new JPAQuery<>(entityManager)
.select(QB.b)
.from(QB.b)
.join(QA.a).on(QA.a.listing.any().eq(QB.b))
.where(QA.a.name.eq("test"))
.fetch();
Но это не работает, так как any()
просто производит подвыбор, вместо объединения многих со многими.
Как мне написать этот запрос в Querydsl