【问题标题】:QueryDSL Left Join not mapping properly with JPA entityQueryDSL Left Join 未与 JPA 实体正确映射
【发布时间】:2019-05-23 04:25:20
【问题描述】:

QueryDSL 不能与 JPA 一起正常工作以进行左连接。 我正在使用 queryDSL 版本 4.2.1 并将响应直接映射到 javax.persistence 实体。 对于左连接/右连接,连接条件不起作用。当entity1.getEntity2() 被调用时,它会获取每个实体,而不考虑加入条件(这里是 name = "testName")。

有没有其他适用于这种情况的方法来映射JOIN表之后的结果?

JPAQuery<Entity1> query = new JPAQuery<>(entityManager);
query.from(table1);
query.leftJoin(table2).on(table2.id.eq(table1.id).and(table2.name.eq("testName"));
List<Entity1> list = query.fetch();
@Entity
public class Entity1{

 private Integer id;

 @OneToMany(mappedBy = "entity1", fetch = FetchType.LAZY)
 private List<Entity2> entity2;
}

【问题讨论】:

    标签: jpa querydsl


    【解决方案1】:

    左连接或右连接是外连接。

    因此,如果您使用左连接,则将选择左侧的所有记录(在您的情况下为 table1)。

    如果你只想要table1中的记录,如果table2上有相应的记录,你必须使用innerJoin。

    JPAQuery<Entity1> query = new JPAQuery<>(entityManager);
    query.from(table1);
    query.innerJoin(table2).on(table2.id.eq(table1.id).and(table2.name.eq("testName"));
    List<Entity1> list = query.fetch();
    

    在此处阅读有关联接类型的更多信息:

    https://www.diffen.com/difference/Inner_Join_vs_Outer_Join

    【讨论】:

    • 在加入条件中我提到了table2.name.eq("testName")。因此,LEFT JOIN 不应从名称不是 testNametable2 获取数据。但无论名称是什么,它都会获取所有数据!
    • 哦,我明白了。这不可能您正在尝试,因为您与 Entity2 有关系,因此所有数据都加载到实体中。
    • 还有其他解决方法吗?比如映射到queryDSL类,而不是JPA,就像JOOQ的映射策略。
    • 这不是关于工具,而是关于集合没有被过滤的事实。您必须对 Entity1 进行两次查询,然后对 Entity2 集合进行第二次查询
    猜你喜欢
    • 2020-03-21
    • 2021-09-13
    • 2011-07-13
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多