在SpringBoot中使用JPA时,我们是否必须使用左连接查询?

时间:2016-10-04 09:59:37

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

我在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)关系。它工作正常。但我想确保使用Left join。它通常是左连接还是我应该专门使用查询?

非常感谢一些帮助。

1 个答案:

答案 0 :(得分:2)

我认为这取决于您使用的JPA提供商。对于Hibernate,使用 fetch = EAGER 属性,Hibernate将无法执行您在加载某些A实体时所期望的内容。

而是执行以下步骤:

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

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

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

相关问题