我有一个条件查询来检索父级及其所有子级。但是hibernate正在触发多个查询以获取子级。我在创建条件时使用了默认的InnerJoin fetch,并尝试设置fetchMode.Join。但没有任何作用。
那么,FetchMode.Join和JoinType之间有什么区别。我认为单独的Jointype足以从单个查询中的两个表中获取数据。但情况确实如此吗?
其次,当条件查询将触发多个查询以获取子级时。?
答案 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