默认join-fetch关联实体

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

我的 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'

由于将此更新应用于我的所有学生查询既乏味又容易出错,是否可以将连接获取设置为默认行为?换句话说,让第一个查询(没有显式连接)的行为类似于第二个查询(默认情况下连接获取过程)?

java hibernate jpa jpql
1个回答
0
投票

恐怕没有这种可能。

join
子句的语义可能会影响查询,因此添加默认子句会很危险。考虑像您这样的示例,但
course
关系是可选的。
join fetch s.course
会将结果限制为具有课程参考的学生(毕竟这是内部联接),而没有课程(或具有无效课程参考)的学生对于查询来说将是不可见的。

JPA 规范指出

FETCH JOIN 允许获取关联或元素集合,作为执行查询的副作用。

除非您证明在一个查询中获取所有内容具有相当大的性能优势,否则我建议使用默认行为......

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