我有两个实体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。