QueryDsl反转manyToMany连接

时间:2020-01-27 08:19:52

标签: java spring jpa querydsl

鉴于我们具有以下形成多对多关系的实体:

@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 并在 A 端应用一些WHERE条件。 由于关联是从 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 BJOIN 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 中编写此查询?

0 个答案:

没有答案