为什么Jpa在使用@Fetch(FetchMode.JOIN)时不发出JOIN查询



我有两个实体Program和Trending。这就是他们之间的关系。

趋势分析:

@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Trending2Program", foreignKey = @ForeignKey(name = 
"FK_Trending_Program"))
private Program program;

程序中:

@OneToMany(mappedBy = "program")
private List<Trending> trendingList;

存储库:

@Repository
public interface TrendingRepository extends JpaRepository <Trending, Integer> {
List<Trending>findByDateBetween(LocalDate startDate, LocalDate endDate);
}

当从服务类执行findById时,hibernate将创建必要的联接:

from
Trending tre0_ 
left outer join
Program program1_ 
on tre0_.trending2Program=program1_.Id

但是当执行findByDateBetween hibernate时,将创建两个独立的查询:

Hibernate: 
select
……
from
Trending tre0_ 
where
tre0_.Date between ? and ?
Hibernate: 
select
…….
from
Program program0_ 
where
program0_.Id=?

有什么不同?我做错了什么,以及如何正确配置hibernate,以便在使用findByDateBetween 时创建必要的联接

谢谢

即使您声明了@ManyToOne(fetch = FetchType.LAZY),但一旦您将获取策略设置为FetchMode.JOIN,它就会被完全禁用。使用Join策略,Hibernate将尝试始终执行联接,而不考虑fetch类型。因此程序不会被延迟加载。

您应该使用@Fetch(FetchMode.SELECT),或者只删除@Fetch,因为FetchMode.SELECT是默认值。

如果这样做,只要不执行trendingObj.getProgram(),就应该始终生成一个选择。

若您一次性需要程序,那个么您可能需要进行紧急获取,即保留FetchMode.JOIN并删除fetch = FetchType.LAZY。或者,您可以使用@Query注释来编写JPQL。

最新更新