我有 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 个条目时,这是非常耗时的。
提前致谢。
这里常见的做法是使用 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。