Hibernate中FetchMode和JoinType有什么区别?

时间:2018-01-03 07:48:51

标签: hibernate jpa

我有一个条件查询来检索父级及其所有子级。但是hibernate正在触发多个查询以获取子级。我在创建条件时使用了默认的InnerJoin fetch,并尝试设置fetchMode.Join。但没有任何作用。

那么,FetchMode.Join和JoinType之间有什么区别。我认为单独的Jointype足以从单个查询中的两个表中获取数据。但情况确实如此吗?

其次,当条件查询将触发多个查询以获取子级时。?

1 个答案:

答案 0 :(得分:1)

set -x MASTER_HOSTNAME=`hostname | cut -d . -f1` TARGET_ENVIRONMENT = it evaluateEnvProp(){ if [ ${TARGET_ENVIRONMENT} = it ]; then ENV_NAME=it && ENV_NODE=1cf62108e084 fi } scpTAR() { echo ENV_NODE echo ${ENV_NODE} if [ ENV_NODE = ${MASTER_HOSTNAME} ] ; then echo "scpTAR ENV_NODE = ${MASTER_HOSTNAME} " else "echo 'scpTAR ssh other node than jenkins server ENV_NODE=${MASTER_HOSTNAME}'" fi } main(){ scpTAR } main 表示将使用连接SQL查询检索相关实体,但它也会打破懒惰,这意味着即使您将您的子实体标记为@Fetch(FetchMode.JOIN)它也不会起作用。为了防止二次查询使用fetch = FetchType.LAZY - Using the JPA Criteria API, can you do a fetch join that results in only one join? 并且我建议不要使用join fetch

跟进阅读:@Fetch - Java Persistence with Hibernate. 2nd edition

  

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

您知道 - 15.4.5 Dynamic fetching with joins不适用于查询 - https://vladmihalcea.com/eager-fetching-is-a-code-smell/ 它几乎总是会生成其他查询,因此,这就是您的问题的答案 - EAGER