现在的位置: 首页 > 综合 > 正文

session.createQuery(hql).list()和.iterator()的区别

2017年12月27日 ⁄ 综合 ⁄ 共 861字 ⁄ 字号 评论关闭

---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=?;把数据读出。

抱歉!评论已关闭.