当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

Query的iterator初步学习笔记

发表于: 2013-11-15   作者:alleni123   来源:转载   浏览次数:
摘要: 出自圣思院hibernate14讲 [Query接口的list与iterator方法深度解析与延迟加载详析] Query query=session.createQuery("from User"); Iterator<User> iter=query.iterate(); while(iter.hasNext()){
出自圣思院hibernate14讲 [Query接口的list与iterator方法深度解析与延迟加载详析]

	Query query=session.createQuery("from User");
		 
		Iterator<User> iter=query.iterate();
		
		while(iter.hasNext()){
			System.out.println(iter.next());
		}


以上代码在运行时, 会出现一个有意思的现象 ,就是程序像数据库发送了N条select语句。(跟数据库里存在的数据量一样)

附上console的内容:
Hibernate: select user0_.id as col_0_0_ from test_user user0_
Hibernate: select user0_.id as id1_1_0_, user0_.test_name as test2_1_0_ from test_user user0_ where user0_.id=?
com.lj.zhang.User@4406cef4
Hibernate: select user0_.id as id1_1_0_, user0_.test_name as test2_1_0_ from test_user user0_ where user0_.id=?
com.lj.zhang.User@1d716fa0





这里先看一下doc里面对iterate的说明

Iterator iterate() throws HibernateException

Return the query results as an Iterator. If the query contains multiple results pre row, the results are returned in an instance of Object[].

Entities returned as results are initialized on demand. The first SQL query returns identifiers only.
Returns:
the result iterator



也就是说, 返回的对象是按需初始化, 第一个sql查询只返回identifiers,在这里就是ID。
Hibernate: select user0_. id as col_0_0_ from test_user user0_
这句被执行的地方在
Iterator<User> iter=query.iterate();

---------再看一下最常用的list方法说明
Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].
这里获取的row就直接被封装到Object[]里面,然后返回。


用一个删除的例子来说明两者的区别.


	Query query = session.createQuery("from User");
		 
		Iterator<User> iter = query.iterate();

		
		while (iter.hasNext())
		{
			session.delete(iter.next());
		}

这个例子会产生大量的select语句, 因为每次执行delete的时候, 都要从数据库读取一个对象。

而换成

 List<User> list=query.list();

		 Iterator listIter=list.iterator();
		 while(listIter.hasNext()){
		 session.delete(listIter.next());
		 }

就只会产生一个select语句, 这样就节约了开支。



----------再用一个读取的例子看一下-------------
		Session session = HibernateUtil.openSession();

		Transaction tx = null;

		tx = session.beginTransaction();

 		Query query = session.createQuery("from User");
 

		 List<User> list=query.list();
 	//	Iterator it=query.iterate();
 

		tx.commit();
		
		[b]session.close();[/b]
		
		for(User u:list){
			System.out.println(u.getName());
		}
		
//		while(it.hasNext()){
//			System.out.println(((User)it.next()).getName());
//		}

这里加入了session.close(),
通过list()方法会正常运行。
但是iterator() 方法就会出错, 因为session已经被关闭。而iterator在被调用的时候则需要再次发送sql语句, 但是已经找不到session了。



=============总结=============
Query接口的list()方法和iterator()方法都可以实现获取查询的对象, 但是list()方法返回的每个对象都是完整的(对象中的每个属性都被表中的字段填充上了), 而iterator()方法所返回的对象中仅包含了主键值(标识符), 只有对iterator()中的对象进行操作时, hibernate才会向数据库再次发生SQL语句来获取该对象的属性值。

Query的iterator初步学习笔记

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
以前一直使用OData Query Designer来生成、验证odata查询字符串,本想把它导入到CRM 2015的环境里,
我们知道Linq to sharepoint 实际最终还是转化成了CALM来对Sharepoint进行访问,那么我们怎样才能知
笔记软件主界面 这东西大概介绍 我想做一个基于oschina的跨平台的笔记软件(做得好就分享给大家,做
现在很多项目的研发管理都转为使用maven进行构建和管理。抽空学习了一下maven,模块化的管理思想,灵
现在很多项目的研发管理都转为使用maven进行构建和管理。抽空学习了一下maven,模块化的管理思想,灵
1、作用: (1、为存储和获取(访问)数据提供了统一的接口(它对数据的存储进行了一层封装,让我们
  一直觉得自己的技术没有一门专长,似乎什么都会一点,但是却一点都不深入。决定学习Android的开
两个月之前准备软考时,简单的从理论上总结了最常用的数据结构和算法,比如:线性表,链表,图。在
STL之迭代器 STL迭代器Iterator 迭代器简介 迭代器Iterator是每个容器都有的。它的作用有点类型指针
这部分是query相关的笔记: peewee————查询 1.创建单条记录(有多种方法): 准备: >>&g
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号