而iterate 方法,则是首先通过一条Select SQL 获取所有符合查询条件的记录的id,再对这个id 集合进行循环操作,
通过单独的Select SQL 取出每个id 所对应的记录,之后填入POJO中返回。
看上去iterate方法似乎有些多余,但在不同的情况下确依然有其独特的功效。
大多数情况下, 应考虑使用 list() 方法执行查询操作。
iterator() 方法仅在满足以下条件的场合, 可以稍微提高查询性能:
1、要查询的数据表中包含大量字段启用了二级缓存。
2、二级缓存中可能已经包含了待查询的对象。
另一方面,对于我们现在的Cache机制而言,list方法将不会从Cache中读取数据,它总是一次性从数据库中直接读出所有符合条件的记录。
而iterate 方法因为每次根据id获取数据,这样的实现机制也就为从Cache读取数据提供了可能,hibernate首先会根据这个id 在本地Cache 内寻找对应的数据,如果没找到,再去数据库中检索。
1:返回的类型不一样,list()返回List, iterate()返回Iterator,
2: 获取数据的方式不一样,list()会直接查数据库, iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。
3:iterate会查询2级缓存, list只会查询一级缓存。
4: list()中返回的List中每个对象都是原本的对象, iterate()中返回的对象是代理对象.(debug可以发现)