论坛首页 Java企业应用论坛

Hibernate iterate和list方法的区别

浏览 2300 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-11-08  

String hql = "from Student";
  Query query = session.createQuery(hql);

 

对于这条语句的查询:

 

List<Student> stus = query.list();

会把所有的查询结果放到list中。一次加载到内存。

语句:select student0_.id as id3_, student0_.studentage as studentage3_, student0_.studentname as studentn3_3_ from Student student0_//当执行list方法的时候

 

Iterator<Student> stus = query.iterate();

该语句只把ID的值放到迭代器中,当遍历的时候,会根据ID的值再去数据库中查。并且该语句会产生N+1次查询。

语句1:select student0_.id as col_0_0_ from Student student0_  //当执行iterate方法的时候

语句2:select student0_.id as id3_0_, student0_.studentage as studentage3_0_, student0_.studentname as studentn3_3_0_ from Student student0_ where student0_.id=?//遍历获取值的时候

 

这两个方法各有千秋。请根据具体情况选择使用(牺牲内存或者牺牲网络资源)。

   发表时间:2012-11-08  
同时要注意缓存问题。iterate可以更加有效使用二级缓存的。所以当缓存命中率非常高的时候,iterate效率可能反而更高。
0 请登录后投票
   发表时间:2013-01-07  
mqchange 写道

 

String hql = "from Student";
  Query query = session.createQuery(hql);

 

对于这条语句的查询:

 

List<Student> stus = query.list();

会把所有的查询结果放到list中。一次加载到内存。

语句:select student0_.id as id3_, student0_.studentage as studentage3_, student0_.studentname as studentn3_3_ from Student student0_//当执行list方法的时候

 

Iterator<Student> stus = query.iterate();

该语句只把ID的值放到迭代器中,当遍历的时候,会根据ID的值再去数据库中查。并且该语句会产生N+1次查询。

语句1:select student0_.id as col_0_0_ from Student student0_  //当执行iterate方法的时候

语句2:select student0_.id as id3_0_, student0_.studentage as studentage3_0_, student0_.studentname as studentn3_3_0_ from Student student0_ where student0_.id=?//遍历获取值的时候

 

这两个方法各有千秋。请根据具体情况选择使用(牺牲内存或者牺牲网络资源)。

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics