Hibernate 解决n+1问题

问题的产生:

两个一对多关系表:class 1-------n student

当查询List<Class> classes  时有一次select查询,要查询班级内的学生则产生了

for(Class class :classes){

class.setStudents(select * from Student where classid = class.getClassId());//所以要执行classes.size()次select查询

}

总共产生了n+1次查询。频繁的select查询影响了数据库的查询效率。

问题的解决:

Hibernate提供的检索策略:

1.延迟加载策略 :lazy=“true” (需要查找班级的学生时才查找,但还是产生了n+1次select查询,这时可以使用二级缓存在二次查询的时候就可快速直接从缓存中得到第一次查找的数据)。

2.迫外左连接查询:select c from class c left join class.students s on class.students.classId = class.classId;(减少了select查询次数,提高了数据库的查询效率,可以通过where条件语句控制得到所想要的student的数量)。

3.fetch=“join”直接关联的立即检索抓取到班级相关的student对象的数据。(优点:减少了select语句的查询。弊端:每次都进行大量的student抓取,如果关联的student很多则会产生过多的数据查询影响数据库的性能)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值