Hibernate中的1+N问题(带级联查询条件的情况)
来源:互联网 发布:网络链路 编辑:程序博客网 时间:2024/04/28 06:44
1. Hibernate中的1+N问题描述
在多对一关系中,当我们需要查询多的一方对应的表的记录时,可以用一条sql语句就能完成操作。然而,在多的一方的实体类中的@ManyToOne标注的fetch的默认值是fetchType.EAGER,这时,hibernate除了发出查询多的一方对应的表的记录的sql语句外,还会发出n(多方记录数)条sql语句,这就是1+n问题。如:bbs的板块(Category),主题(topic),回复(msg)。一个板块有多个主题,而一个主题属于一个板块,则Category和topic属于一对多的关系,在topic里设置@ManyToOne。当需要取出所有的主题时,只需要发出select * from topic一条语句就能做到。然而,hibernate会查询出每个topic所对应的Category,所以会发出1+n条sql语句。
2. 1+N问题的解决办法
①设置@ManyToOne的fetch属性值为fetchType.LAZY,这种方式解决后,后面的n条sql语句按需而发。但是有个弊端,就是如果需要级联查询就无法获取级联对象了。
②设置@BatchSize(size=5)(该注解要加在类上面,跟@Entity在同一位置),这样发出的sql语句减少。这个设置在一定程度上提高了效率。
③在hqp语句中使用用join fetch,事实上Criteria用的就是这种方法。这也是最常用的方法;
3: 注:上面的就是最简单的1+n问题了
本人在项目中遇到过更加复杂的1+n问题。当带条件查询的时候:
如果我有查询条件呢?用left join fetch要报错
比如下面这个查询
from Topic t left join fetch t.category c where t.c.id='id' 会报错
from Topic t where t.c.id='id' 不会报错,但是有1+n问题。
目前我还没有找到办法解决这个问题,找到解决办法了,会更新文章的。
比如下面这个查询
from Topic t left join fetch t.category c where t.c.id='id' 会报错
from Topic t where t.c.id='id' 不会报错,但是有1+n问题。
- Hibernate中的1+N问题(带级联查询条件的情况)
- hibernate级联查询执行n+1次sqlt语句问题(内含解决办法,优化方式)
- hibernate中带查询条件的分页
- HIBERNATE的N+1查询问题
- hibernate查询的1+n问题
- HIBERNATE的N+1查询问题
- HIBERNATE的N+1查询问题
- Hibernate 查询缓存 1+N的问题.
- hibernate N+1查询问题
- hibernate 查询n+1问题
- Hibernate表中的1+N的问题
- Hibernate中的N+1 问题(一)
- 【03】SSH练习——hibernate的级联和1+n问题
- Struts2+Hibernate+Spring带条件的分页查询
- Hibernate实现不带条件的简单分页查询
- 使用hql或条件查询解决一对多关联查询的N+1查询问题
- hibernate中的N+1问题
- hibernate中的1+N问题
- Memcache详细解读
- 【深度学习】caffe 中的一些参数介绍
- Android material 风格和 ios 风格的 dialog,可传入 context 构建,在任意地方弹出,一行代码调用
- DialogFragment
- mysql-mmm 集群高可用软件介绍
- Hibernate中的1+N问题(带级联查询条件的情况)
- nlp-词向量-相关
- git与svn cvs对比
- [iOS]Xcode8 搭建 .framework
- 高可用MySQL MHA介绍
- HDU 5893 List wants to travel
- service 与thread 应用背景
- cuda实例——简单调用核函数
- java设计模式之单例模式