对于list方法而言,实际上Hibernate是通过一条Select SQL获取所有的记录。并将其读出,填入到POJO中返回。
而iterate 方法,则是首先通过一条Select SQL 获取所有符合查询条件的记录的id,再对这个id 集合进行循环操作,通过单独的Select SQL 取出每个id 所对应的记录,之后填入POJO中返回。
也就是说,对于list 操作,需要一条SQL 完成。而对于iterate 操作,需要n+1条SQL。
看上去iterate方法似乎有些多余,但在不同的情况下确依然有其独特的功效,如对海量数据的查询,如果用list方法将结果集一次取出,内存的开销可能无法承受。
另一方面,对于我们现在的Cache机制而言,list方法将不会从Cache中读取数据,它总是一次性从数据库中直接读出所有符合条件的记录。而iterate 方法因为每次根据id获取数据,这样的实现机制也就为从Cache读取数据提供了可能,hibernate首先会根据这个id 在本地Cache 内寻找对应的数据,如果没找到,再去数据库中检索。

Query的两个方法,list() 和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,
1:返回的类型不一样,list()返回List, iterate()返回Iterator,
2: 获取数据的方式不一样,list()会直接查数据库, iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

3:iterate会查询2级缓存, list只会查询一级缓存。
4: list()中返回的List中每个对象都是原本的对象, iterate()中返回的对象是代理对象.(debug可以发现)

最新文章

  1. Ubuntu14.04下安装docker
  2. python中列表、元组、字典内部功能介绍
  3. Learn sed using these command on Linux(流线式编辑器——sed)
  4. IOS基础之 (十二) 类的扩展
  5. jquery zclip 复制黏贴功能不能实现
  6. 转:OpenCms 9.0.1汉化
  7. (转载)李剑英的CSLight入门指南结合NGUI热更新
  8. Codevs 1063 合并果子
  9. VS2010使用EventHandler发邮件
  10. Android开发了解——Dalvik
  11. 习WebSocket一(WebSocket初识)[转]
  12. [Javascript] Using JSHint for Linting with Gulp
  13. a为整型数组,&a+1的含义
  14. JAVA语言规范和API网址
  15. VS2010下编译sqlite3
  16. iOS基于AVPlayer的视频播放
  17. javaScript(1)---概述
  18. 堆&栈的理解(转)
  19. 最全的libcurl库资源整理
  20. centos6 pyenv和virtualenv搭建python虚拟环境

热门文章

  1. SOME:收缩数据库日志文件,查看表数据量和空间占用,查看表结构索引修改时间
  2. redis命令String
  3. JSP计算器
  4. HDU 2295 Radar (重复覆盖)
  5. dp与px转换
  6. linux 正则表达式与文件格式化处理
  7. android之Fragment基础详解(一)
  8. SQL Server 2012 通用分页存储过程
  9. JQUERY 保存成功后又下角动态提示
  10. win10使用小技巧以及常见问题处理方案