QueryDsl инвертировать многие toMany присоединиться - PullRequest
1 голос
/ 27 января 2020

Учитывая, что у нас есть следующие объекты, которые формируют отношение многие ко многим:

@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;

}

enter image description here Мне нужно написать запрос, который выбирает 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

...