---session.createQuery(hql).list()和.iterator()的区别:
链接:http://javakeith.iteye.com/blog/865175
list()一次将数据从数据库中读出直接填充到List中
iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行
list()只发一条语句将符合条件的数据全部查出,
而iterator()却现将id查出来,然后根据id再将符合条件的数据查出
对缓存处理的区别:
list()实际上无法利用缓存,它对缓存只写不读,而iterator()可以充分利用缓存,如果目标数据只读或者读取相当频繁,可以使用iterator()来减少性能上的消耗;
iterator方法首先在本地缓存内根据id查找对应的实体对象是否存在,如果缓存中已经存在对应的数据,则直接以此数据对象作为查询结果;如果没有找到,则再次执行Select语句获得对应数据库中的表记录(如果iterator在数据库中查到并构建了完整的数据对象,也会将其纳入缓存中);
比如有这样一个po PO: User.class properties: userId,userName DDL: create table tuser (userid varchar(10),username varchar(20)); 当执行: session.createQuery("from User u").list()时生成的SQL: select userid,username from tuser; 当执行: session.createQuery("from User u").iterator()时生成的SQL: select userid from tuser; 可以看出list()一次将数据从数据库中读出直接填充到List中 iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行: select userid,username from user where userid=?;把数据读出。