iterator()方法的出现主要是为了解决查询是的性能问题。例如下面使用list()方法取得对象的代码:
........//打开
Session,开启事务
Query q =
session.createQuery("from Student");
//以下为查询在name中"t"字符的所以学生
q =
session.createQuery("from Student s where s.name like 't%'");
q.list();
........//提交事务,关闭
session运行以上代码,得到的控制台信息如下:
Hibernate : select s.* from student s
Hibernate : select s.* from student s where s.name like 't%'
第2条select 语句查找所以匹配条件的对象,然后根据起id值到
Session缓寸中查找这个对象是否已经存在,如果已经存在,则返回
缓存中这个对象的引用,不再重新组装对象。因此select * 是不必要的,只需要select s.id 即可。
Query接口的
iterator()方法发送select 语句检索id字段,然后根据id 值在
Session缓存和二级
缓存中查找匹配的对象,如果存在,把它直接加到查询结果返回,如果不存在,根据刚才已经检索出来的id,执行额外的 select语句到数据库检索该对象。
Student表中共有两个Student对象,首先通过get()方法把一个Student对象加载到
Session缓存,然后再查询所有的Student对象,观察控制台的输出语句,如下代码所示:
.....//打开
session,开启事务
stu = (Student)
session.get(Student.class , new Integer(1));
Query q = session.createQuery("from Studnet");
Iterator it = q.iterator();
stu1 = (Student) it.next();
stu2 = (Student) it.next();
........//提交事务,关闭 session
运行以上代码,得到的控制台信息如下:
Hibernate : select s.* from student s where s.id = ?
Hibernate : select s.id from student s
Hibernate : select s.* from student s where s.id = ?
第1条select * 语句是由get()方法引起的,第2条select s.id 是由q.iterator()引起的(如果调用集合对象的iterator()方法,将会发送select * from table,比如team.getStudent().iterator()),第3条语句是因为在缓存中只存在一个Student对象,还有一个 Student对象必须发送SQL语句从数据库取得,然后再把它加入到session缓存中。
Query接口的iterator()方法和load()方法很相似,只不过load()用于加载单独的对象,而iterator()用于批量的加载。某 些情况下, 可以使用iterator()获得更好的性能。这通常用于预期返回的结果在Session,或二级缓存中(second-level cache)中已经存在时的情况。当缓存中的对象很少,或者iterator()查询的范围过于宽广时(比如HQL语句"from Student"),反而对性能造成不利的影响,因为iterator()方法第一次总是查询所有的id,然后根据id值一条一条地发送select 语句去取得对象,因此如果有有10000条记录,而且是在Session中是第一次查询时(缓存中还没有对象数据),则要发送10001条SQL语句去取 得数据,这样的话,还不如直接用以下语句来得方便高效。
PS:以上资料 来源于Hibernate 开发及整合应用大全 --蔡雪焘 编著
分享到:
相关推荐
Iterator<Login> iter = query.list().iterator(); if (iter.hasNext()) { login = (Login) iter.next(); } System.out.println("主键精确查询:"); this.session.close(); return login; } ``` 在编写代码...
【标题】"Hibernate教程24_Hibernate的补充_list与iterator" 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。本教程将重点讲解在使用Hibernate时,如何处理查询结果集合...
### HIBERNATE_QUERY知识点详解 #### 一、概述 Hibernate作为一款强大的对象关系映射(ORM)框架,为Java开发者提供了一套高效且简洁的方式来处理数据库操作。它支持多种查询方式,包括面向对象的查询语言(HQL)...
List<Customer> customers = query.list(); ``` ##### 4. QBC方式(Query By Criteria) - **定义**:QBC是Hibernate提供的另一种查询方式,基于标准的Java API,提供了更多的灵活性。 - **应用场景**:构建复杂...
本文将深入探讨Hibernate中的几种主要的数据获取方式,包括`Session.get()`与`Session.load()`、`Query.iterator()`与`Query.list()`以及使用HQL(Hibernate Query Language)进行查询。 ### 1. `Session.get()`与`...
Hibernate 提供了多种方式来处理结果集,例如使用 `list()` 方法获取整个结果集,或者使用 `Iterator` 迭代器来逐个处理结果集。例如: ```java Query query = session.createQuery("from Student"); List<Student> ...
### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...
HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的数据检索方式,使开发人员能够更高效地与数据库交互。本文将详细介绍HQL的基本用法及高级特性。 #### 1. 查询所有记录(Select) ...
Hibernate Query Language(HQL)是一种面向对象的查询语言,它允许开发者通过对象模型而非数据库模式来表达数据库查询。HQL与SQL语法类似,但它理解Java实体和属性,因此HQL查询的对象是Java类而不是数据库中的表。...
3. **Query 和 list/iterator**:list 方法仅利用查询缓存,而 iterator 方法可以利用二级缓存。在进行大量数据查询时,iterator 方法更加高效。 #### 七、总结 优化 Hibernate 的性能涉及到多个方面,包括数据库...
在Java开发中,Hibernate是一个流行的持久化框架,它简化了数据库操作,将对象与关系数据库之间的映射管理自动化。本篇将深入讲解在Hibernate中常用的查询语句,包括HQL(Hibernate Query Language)和QBC(Query By...
本文档基于魔乐科技李兴华老师的 Hibernate 教程笔记进行整理与扩展,主要介绍了 Hibernate 的数据检索方法,特别是 HQL(Hibernate Query Language)的使用技巧。 #### 二、HQL 基础 HQL 是一种面向对象的查询语言...
使用`load()`方法获取的单个持久化对象会被缓存,但若想缓存`findAll()`, `list()`, `Iterator()`, `createQuery()`, `createCriteria()`等方法获取的结果集,必须设置`hibernate.cache.use_query_cache`为`true`。...
在本文中,我们将深入探讨Hibernate框架中的数据查询,特别是使用Hibernate Query Language (HQL)。Hibernate是一个流行的Java持久化框架,它允许开发者通过面向对象的方式来操作数据库,极大地简化了数据库交互的...
本文将详细介绍如何通过Hibernate进行批量删除,并探讨其背后的工作原理与优化技巧。 #### 二、批量删除的基本方法 1. **基本思路**:批量删除可以通过执行一次或多条SQL语句来完成。通常情况下,为了提高效率,...
其中,`<property name="hibernate.cache.use_query_cache">true</property>`这一配置用于启用查询缓存,意味着通过findall()、list()、Iterator()、createCriteria()、createQuery()等方法获取的数据结果集会被缓存...
List list = query.list(); for (Iterator iter = list.iterator(); iter.hasNext();) { Classes classes = (Classes) iter.next(); System.out.println("class's name=" + classes.getName()); for (Iterator ...
List list = query.list(); iterator = list.iterator(); return iterator; } ``` #### 四、模糊查询 模糊查询通常用于根据部分匹配条件来查找记录。在Hibernate中,可以使用`like`语句来实现模糊查询。 **...
【Query 的 list()与iterator()方法的区别】 - **list()**:将查询结果转换为 List 集合,一次性加载所有结果,适用于数据量较小的情况,因为所有结果都会加载到内存中。 - **iterator()**:返回一个迭代器,可以...
5. **返回List集合**:Query.list() 返回List集合,Query.iterate() 返回Iterator。 - **Query.list()** 和 **Query.iterate()** 的主要区别在于返回类型和查询策略: - **Query.list()** 直接查询数据库,并将...