Hibernate 1+N 问题

阅读更多

问题名称:Hibernate 1+N 问题(N+1问题)

 

问题概述:在Hibernate  二个或者多个对象有关联(包含之前所述4种关联)的情况,并且设置

fetch = FetchType.EAGER。在执行hql查询语句的时候,查询一个表,将会随便查询出所有相关联的表,

即:发出一条sql语句后,继续发出N条sql语句。

这种问题在多对一关联(最为常见)尤为严重,假如存在user表和group表并且为多对一关联,

user表中有1000条数据,group表中有100条数据。那么这样查询就会产生

1(select user ...)+1000(select group ... where id=XXX)条sql语句,DB将欲哭无泪啊!

 

解决方案:

1、假如不需要用到关联对象,直接设置fetch = FetchType.LAZY,这样在默认查询的时候就不会多发出N条sql语句了

2、假如用到关联对象,使用sql的左外连接。也就是hql的Left Join Fetch合并为一条sql语句。

图个方便就把session.createQuery(User.class).list();改为session.createCriteria(User.class).list();

因为session.createCriteria()默认使用的是Join Fetch。

详细点改为这样:session.createQuery("from User u left join fetch u.group g").list();

 

后记:以上的做法可以将查询效率控制在一个可以接受的范围内了,假如对效率要求非常严格的(最好不使用Hibernate),可以采用分布式数据库加缓存查询等来进一步提高效率。 

 

你可能感兴趣的:(Hibernate,I+N,查询,sql,效率)