如何在单个查询中获取反向连接的实体?

问题描述 投票:0回答:1

我有 2 个实体,学生和注释:

@Entity
public class Student {

  @Id
  @GeneratedValue(strategy = GenerationType.UUID)
  private UUID id;

  @OneToOne(fetch = FetchType.LAZY, mappedBy = "student")
  private Note note;
}

@Entity
public class Note {

  @Id
  @GeneratedValue(strategy = GenerationType.UUID)
  private UUID id;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "student_id")
  private Student student;
}

如果我尝试使用

studentRepositoy::findAllById
获取 100 名学生,Hibernate 会执行
in
查询并传递所有 ID。这很好,但随后它会再发出 100 个查询来获取每个学生的笔记。
FetchType.LAZY
在这里没有帮助。我也尝试了
FetchMode.JOIN
FetchMode.SELECT
,但他们也没有解决问题。

我们有什么办法可以和学生一起取走纸条吗?我的意思是这只是一个简单的例子,但在生产中,父类有多个像 Note 这样的实体,它们是反向连接的,在获取 1000 个条目时,这是非常耗时的。

提前致谢。

java hibernate jpa spring-data-jpa jpa-2.0
1个回答
0
投票

这里常见的做法是使用 LEFT JOIN FETCH。考虑使用自定义查询更改或添加方法到您的存储库,如下所示:

// your repository here
public interface StudentRepository extends JpaRepository<Student, UUID> { 
  // other methods in your repository
  // ...
  @Query(value = "SELECT s FROM Student s LEFT JOIN FETCH s.note") 
  List<Student> fetchAllStudentsWithNote(); 

“LEFT JOIN FETCH”完成工作并保持 Fetch.Type = LAZY。

© www.soinside.com 2019 - 2024. All rights reserved.