我的 Hibernate/JPA 模型有这个实体类
@Entity
public class Student {
@ManyToOne(optional = false)
@JoinColumn(name = "course_id")
private Course course;
// other properties, getters, setters, etc. omitted
}
这种学生与课程的关系是单向的,即
Student
中没有引用 Course
实体。
@ManyToOne
的默认获取类型是eager,因此上面的注释与@ManyToOne(optional = false, fetch = FetchType.EAGER)
相同。
因此,每当我执行获取学生的查询时,也会获取关联的课程,例如
select s
from Student s
where s.name = 'Bob'
但是,虽然同时获取课程,但会发出单独的查询来获取它们。如果我想在单个查询中获取学生和课程,我需要在 JPQL 查询中显式包含
join fetch
,例如
select s
from Student s
join fetch s.course
where s.name = 'Bob'
由于将此更新应用于我的所有学生查询既乏味又容易出错,是否可以将连接获取设置为默认行为?换句话说,让第一个查询(没有显式连接)的行为类似于第二个查询(默认情况下连接获取过程)?
恐怕没有这种可能。
join
子句的语义可能会影响查询,因此添加默认子句会很危险。考虑像您这样的示例,但 course
关系是可选的。 join fetch s.course
会将结果限制为具有课程参考的学生(毕竟这是内部联接),而没有课程(或具有无效课程参考)的学生对于查询来说将是不可见的。
JPA 规范指出
FETCH JOIN 允许获取关联或元素集合,作为执行查询的副作用。
除非您证明在一个查询中获取所有内容具有相当大的性能优势,否则我建议使用默认行为......