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

在SpringBoot中使用JPA时,是否必须显式使用左连接查询?,spring,hibernate,jpa,spring-boot,spring-data,Spring,Hibernate,Jpa,Spring Boot,Spring Data,我在SpringBoot工作,我使用JPA存储库进行DB访问。我有两种说法 Class A{ @Id private String primarykeyColumnA; @OneToMany(mappedBy="campaign",fetch = FetchType.EAGER,cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }) private Set<B> b; .... }

我在SpringBoot工作,我使用JPA存储库进行DB访问。我有两种说法

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类{
@身份证
私有字符串primarykeyColumnA;
@OneToMany(mappedBy=“campaign”,fetch=FetchType.EAGER,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
私有集b;
....
}
B类{
@身份证
私人长primaryKeyColB;
@manytone(fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.REMOVE})
@JoinColumn(name=“primarykeyColumnA”)
私人A;
}
所以我必须连接这两个表,这是一对多(对于一个A,将有多个B)关系。它很好用。但我想确保我使用左连接。它通常是左连接还是我应该专门使用查询


非常感谢您的帮助

我认为这取决于您使用的JPA提供商。在Hibernate的情况下,使用fetch=EAGER属性,Hibernate在加载某些实体时不会执行预期的操作

相反,将执行以下步骤:

  • 执行SQL查询以加载a实体,而不加载B实体
  • 对于每个A实体,执行SQL查询以加载其相关的B实体
如果B实体不在缓存中,则会出现1+n查询问题


如果您想通过一个SQL查询加载A实体和相关的B实体,您必须使用join fetch子句(左,内,…取决于您的情况)。

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

相反,将执行以下步骤:

  • 执行SQL查询以加载a实体,而不加载B实体
  • 对于每个A实体,执行SQL查询以加载其相关的B实体
如果B实体不在缓存中,则会出现1+n查询问题


如果要通过单个SQL查询加载A实体和相关B实体,则必须使用join fetch子句(左,内,…取决于您的情况)进行查询。

谢谢您的回答。我正在使用Hibernate。我不理解你提到的1+n查询问题。我担心的是,如果没有与特定a关联的B。在内部联接的情况下,我将不会得到任何结果,因为对应的a权限没有B值?1+n问题意味着,当您对a实体执行JPA查询时,Hibernate将创建1个SQL查询来加载a实体,然后使用n个SQL查询为之前加载的每个A实体加载B实体。在这种情况下,如果没有任何与A相关的B实体,您就不会有问题。谢谢您的回答。我正在使用Hibernate。我不理解你提到的1+n查询问题。我担心的是,如果没有与特定a关联的B。在内部联接的情况下,我将不会得到任何结果,因为对应的a权限没有B值?1+n问题意味着,当您对a实体执行JPA查询时,Hibernate将创建1个SQL查询来加载a实体,然后使用n个SQL查询为之前加载的每个A实体加载B实体。在这种情况下,如果没有任何与A相关的B实体,您就不会有问题。