`

Query的iterator初步学习笔记

阅读更多
出自圣思院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语句来获取该对象的属性值。
分享到:
评论

相关推荐

    java学习笔记模版

    【Java学习笔记模版】 Java实习工程师在学习过程中,会涉及到许多关键知识点,尤其是在企业级开发的场景下。从给出的四天学习笔记来看,实习生正在逐步掌握Java Web开发的基础和核心技能。以下是对这些知识点的详细...

    iterator_adaptor.pdf

    Boost库中的`iterator_adaptor`是一个强大的工具,用于创建自定义迭代器。这个模板类允许程序员以一种灵活的方式包装现有的迭代器类型,以适应特定的需求或扩展其功能。`iterator_adaptor`的设计理念是基于`iterator...

    模拟java ArrayList Iterator

    总的来说,这个资源提供了学习和实践Iterator设计模式的机会,加深了对Java集合框架的理解。通过模拟ArrayList的Iterator实现,我们可以更深入地掌握如何在实际编程中利用这一强大的工具。同时,这也为我们设计自己...

    C#学习笔记整理-迭代器模式介绍

    迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 何时使用迭代器模式? 当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,需要考虑使用迭代器...

    iterator嵌套,struts2

    在Struts2框架中,`iterator`标签是一个非常重要的组件,用于遍历各种集合对象,如List、Map等。在上述描述中,开发者遇到了一个关于`iterator`标签嵌套使用的问题,涉及到`LinkedHashMap`存储的数据结构。让我们...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    丛书名: 学习笔记 出版社:清华大学出版社 ISBN:9787302282082 上架时间:2012-5-9 出版日期:2012 年5月 开本:16开 页码:564 版次:1-1 所属分类:计算机 &gt; 软件与程序设计 &gt; JAVA(J#) &gt; Java 编辑推荐   ...

    Java JDK 7学习笔记 完整扫描版

    **Java JDK 7学习笔记概述** Java JDK 7(Java Development Kit 7)是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司收购)开发,并于2011年7月28日正式发布。这个版本引入了一系列新特性、改进...

    Iterator用法

    ### C++中的Iterator模式详解 #### 什么是Iterator模式? 在软件工程中,设计模式是一种用于解决特定问题的通用可重用解决方案。Iterator模式是其中的一种,其主要目标是在不暴露集合内部结构的情况下,为遍历集合...

    JAVA中的Iterator的用法

    ### JAVA中的Iterator的用法详解 #### 一、概述 在Java编程语言中,`Iterator`接口扮演着遍历集合的重要角色。它提供了一种方式,使得开发人员能够以一致的方式遍历各种类型的集合,无需了解集合的具体实现细节。...

    Iterator迭代器讲解

    ### Iterator迭代器详解 #### 一、Iterator简介与概念 在Java编程语言中,`Iterator`接口是一个重要的组件,它提供了遍历集合的基本方法。`Iterator`的主要作用是在不暴露集合内部结构的情况下,顺序访问集合中的...

    图解设计Iterator 源代码

    在Java编程语言中,`Iterator`接口是集合框架的核心部分,它允许我们遍历集合中的元素,而无需暴露集合的内部结构。这个设计模式被称为迭代器模式,它为访问聚合对象(如数组、集合等)提供了一种统一的接口。在本...

    一个运用Extjs,Struts2, json,iterator技术构建的iterator_jsonDemo2。 将数据从后台传到Extjs表现层。

    一个运用Extjs,Struts2, json,iterator技术构建的iterator_jsonDemo2。iterator_jsonDemo1的链接:http://download.csdn.net/detail/cafebar123/8816409 运用了Extjs,Struts2, json,iterator技术, 将数据从...

    Ruby学习笔记(学习心得)

    Ruby学习笔记 01 类的属性与方法 02 访问控制 03 Container(Array/Hash) 04 Iterator 05 简单数据类型 06 范围 07 方法 08 条件控制 09 异常处理

    C++ Primer 中文版(第四版)学习笔记~

    以上是C++ Primer第四版学习笔记中涉及的一些核心知识点。这些知识点涵盖了C++编程的基础语法、数据类型、容器、指针、内存管理以及控制结构等多个方面,对于初学者理解和掌握C++语言具有重要意义。希望这些内容能够...

    Iterator迭代器的用法

    该文档是演示迭代器Iterator的使用方法和源代码,其中包括了Iterator的继承类的讲解和再Iterator中的两种方法

    struts2 标签iterator使用

    在Struts2框架中,`&lt;s:iterator&gt;`标签是一个非常强大的工具,用于遍历集合或数组中的元素,尤其在处理列表数据时极为有用。通过本文档提供的代码示例,我们将深入探讨`&lt;s:iterator&gt;`标签的使用方法及其与不同数据...

    java-util-iterator.pdf java-util-iterator.pdf

    根据提供的文件信息,本文将深入探讨Java中的`java.util.Iterator`接口及其在集合类中的应用。我们将从以下几个方面进行详细解析: ### 一、集合类的根接口:Collection `Collection`接口是Java集合框架的基础,它...

    iterator的常用函数

    是关于iterator的函数,以及它们的作用!

    P246~250C++常用查找算法学习笔记.docx

    C++常用查找算法学习笔记 本篇学习笔记主要介绍了C++中常用的查找算法,包括find_if、adjacent_find和binary_search等。 find_if算法 find_if算法是C++ STL中的一种查找算法,用于查找容器中的元素是否满足某个...

    struts2中iterator 标签的使用详解

    ### Struts2中Iterator标签的深入解析与应用 在Struts2框架中,`&lt;s:iterator&gt;`标签是一个非常强大的工具,用于在JSP页面上循环遍历集合数据,如列表(List)、数组、Map等。它允许开发者以一种动态且灵活的方式展示...

Global site tag (gtag.js) - Google Analytics