【问题标题】:Do we have to explitly use Left Join query while using JPA in SpringBoot?在 Spring Boot 中使用 JPA 时,我们是否必须显式使用 Left Join 查询?
【发布时间】:2017-02-12 10:45:02
【问题描述】:

我在 SpringBoot 中工作,并且正在使用 JPA 存储库进行数据库访问。我有两个实体说

Class A{
 @Id
 private String primarykeyColumnA;
 @OneToMany(mappedBy="campaign",fetch = FetchType.EAGER,cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH })

private Set<B> b;
 ....
}

Class B{
 @Id
 private Long primaryKeyColB;

 @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE })
@JoinColumn(name = "primarykeyColumnA") 
private A a;
}

所以我必须加入这两个表,这是一对多(一个A,会有很多B)的关系。它工作正常。但我想确保我使用左连接。它通常是左连接还是我应该专门使用查询?

非常感谢一些帮助。

【问题讨论】:

    标签: spring hibernate jpa spring-boot spring-data


    【解决方案1】:

    我认为这取决于您使用的 JPA 提供程序。在 Hibernate 的情况下,使用 fetch=EAGER 属性,当您加载一些 A 实体时,Hibernate 不会执行您所期望的操作。

    将执行以下步骤:

    • 执行 SQL 查询以加载 A 实体,而不加载 B 实体。
    • 对于每个 A 实体,执行 SQL 查询以加载其相关的 B 实体。

    如果 B 实体不在缓存中,就会出现 1+n 查询问题。

    如果您想通过单个 SQL 查询加载具有相关 B 实体的 A 实体,您必须使用使用 join fetch 子句的查询(left、inner、...取决于你的情况)。

    【讨论】:

    • 感谢您的回答。我正在使用休眠。我不明白你提到的 1+n 查询问题。我担心的是,如果没有与特定 A 关联的 B。在内部联接的情况下,我不会得到任何结果,因为相应的 A 将没有 B 值对吗?
    • 1+n 问题的意思是,当你对 A 实体执行 JPA 查询时,Hibernate 会创建 1 个 SQL 查询来加载 A 实体,然后再创建 n 个 SQL 查询来加载 B 实体每个 A 实体之前加载。在这种情况下,如果没有与 A 相关的任何 B 实体,您将不会遇到问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2020-02-26
    • 2011-06-12
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多