JPAQuery连接中间多对多表

时间:2018-01-12 14:50:33

标签: java jpa querydsl

我正在使用QueryDSL JPA,并希望在两个表之间进行连接。我已经在这里发现了很多类似的问题,但是我的情况与所有这些问题的不同之处在于一个小细节。这是我的课程的简化版本:

@Entity(name = "TABLE_A")
public class TableA {
    @Id
    @Column(name = "ID_A", nullable = false)
    private Long idA;
}


@Entity(name = "TABLE_B")
public class TableB {
    @Id
    @Column(name = "ID_B", nullable = false)
    private Long idB;
}


@Entity(name = "TABLE_C")
public class TableC {
    @Id
    @Column(name = "ID_C", nullable = false)
    private Long idC;

    @JoinColumn(name = "ID_A", referencedColumnName = "ID_A")
    @ManyToOne
    private TableA tableA;

    @JoinColumn(name = "ID_B", referencedColumnName = "ID_B")
    @ManyToOne
    private TableB tableB;
}

现在我要做的是连接表A,C和B,找到链接到A的B。我知道这似乎是一个无用的步骤,为什么不直接添加从A到B的关系。在我的情况下,这是必要的,这些只是示例类。

我试过了:

QTbTableA tableA = QTbTableA.tableA;
QTbTableB tableC = QTbTableC.tableC;
JPAQuery query = new JPAQuery(entityManager).from(tableA);
query.leftJoin(tableA, tableC.tableA);

连接抛出异常,因为tableC.tableA不是根路径,只是属性。但是,如何正确地加入这些表呢?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您想保留当前的impl,可以从TableC开始,然后加入其他表:

query.from(tableC)
    .innerJoin(tableC.tableA, tableA)
    .innerJoin(tableC.tableB, tableB)
    .where(tableA.idA.eq(myId)
    .list(tableB);