Hibernate中FetchMode和JoinType的区别是什么?

Hibernate中FetchMode和JoinType的区别是什么?,hibernate,jpa,Hibernate,Jpa,我有一个检索父项及其所有子项的条件查询。但是hibernate正在启动多个查询来获取子对象。我在创建条件时使用了默认的InnerJoin获取,并尝试设置fetchMode.Join。但什么都不管用 那么,FetchMode.Join和JoinType之间的区别是什么呢。我认为Jointype本身就足以在一个查询中从两个表中获取数据。但事实是这样吗 其次,当criteria query将触发多个查询以获取子实体时。@fetch(FetchMode.JOIN)表示将使用JOIN SQL查询检索相关实

我有一个检索父项及其所有子项的条件查询。但是hibernate正在启动多个查询来获取子对象。我在创建条件时使用了默认的InnerJoin获取,并尝试设置fetchMode.Join。但什么都不管用

那么,FetchMode.Join和JoinType之间的区别是什么呢。我认为Jointype本身就足以在一个查询中从两个表中获取数据。但事实是这样吗

其次,当criteria query将触发多个查询以获取子实体时。

@fetch(FetchMode.JOIN)
表示将使用JOIN SQL查询检索相关实体,但这也打破了惰性,这意味着即使您将子实体标记为
fetch=FetchType.LAZY
也无法工作。为了防止二次查询,请使用
join fetch
- 我也不建议使用
@Fetch

后续阅读:
Java持久化与Hibernate。第2版
-
15.4.5带联接的动态获取

查询忽略您在映射中定义的任何获取策略 带有@org.hibernate.annotations.Fetch的元数据。例如,映射 包含org.hibernate.annotations.FetchMode.JOIN的bids集合 对您编写的查询没有影响。网络的动态抓取策略 您的查询忽略全局抓取策略。另一方面 Hibernate不会忽略映射的获取计划:Hibernate始终 考虑FetchType.EAGER,您可能会看到几个额外的SQL语句 执行查询时的语句

正如您所知-
EAGER
不适用于查询- 它几乎总是生成额外的查询,因此,这就是您的问题的答案-
当criteria查询将触发多个查询以获取子对象时?
@fetch(FetchMode.JOIN)
说将使用JOIN SQL查询来检索相关实体,但它也打破了惰性,这意味着即使您将子实体标记为
fetch=FetchType.LAZY
它也不会工作。为了防止二次查询,请使用
join fetch
- 我也不建议使用
@Fetch

后续阅读:
Java持久化与Hibernate。第2版
-
15.4.5带联接的动态获取

查询忽略您在映射中定义的任何获取策略 带有@org.hibernate.annotations.Fetch的元数据。例如,映射 包含org.hibernate.annotations.FetchMode.JOIN的bids集合 对您编写的查询没有影响。网络的动态抓取策略 您的查询忽略全局抓取策略。另一方面 Hibernate不会忽略映射的获取计划:Hibernate始终 考虑FetchType.EAGER,您可能会看到几个额外的SQL语句 执行查询时的语句

正如您所知-
EAGER
不适用于查询- 它几乎总是生成额外的查询,所以,这就是问题的答案-
什么时候条件查询将触发多个查询来获取孩子?