- 浏览: 1240290 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
示例演示查询list与iterate的区别
1、实体对象的查询,查询的是实体对象的数据【重要】 * n+1问题,在默认配置的情况下,使用query.iterate()操作,有可能有n+1问题,所谓 n+1,指在查询对象数据的时候,发出了n+1条查询语句。 1:首先发出了一条查询语句,查询对象的id列表 n:在迭代访问每个对象的时候,如果缓存中没有对象数据,Hibernate会在此发出一条查询语句, 查询相应的对象 *List操作与Iterate操作的区别 list,每次都会发出一条查询语句,查询所有的对象 iterate,首先发出一条查询语句,查询对象的id列表,然后根据缓存情况,决定 是否发出更多的查询语句,来查询对象数据
查看下面的代码:
package com.bjsxt.hibernate; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import junit.framework.TestCase; /** * 对象查询中的list操作和iterator操作的差异 * @author Administrator * */ public class SimpleObjectQueryTest2 extends TestCase { public void testQueryWithListMethod() { Session session = null; try { session = HibernateUtils.getSession(); /** * 将发出一条查询语句,获取Student的集合数据 * select student0_.id as id1_, student0_.name as name1_, * student0_.createTime as createTime1_, student0_.classid as classid1_ * from t_student student0_ */ List students = session.createQuery("from Student").list(); for (Iterator iter = students.iterator();iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testQueryWithIterateMethod() { Session session = null; try { session = HibernateUtils.getSession(); //先发出查询id的列表语句 //select student0_.id as col_0_0_ from t_student student0_ //再依次发出查询对象的sql(根据id) //select student0_.id as id1_0_, student0_.name as name1_0_, //student0_.createTime as createTime1_0_, student0_.classid as classid1_0_ //from t_student student0_ where student0_.id=? Query query = session.createQuery("from Student"); Iterator students = query.iterate(); while (students.hasNext()) { Student student = (Student)students.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testQueryWithListAndIterate() { Session session = null; try { session = HibernateUtils.getSession(); Query query = session.createQuery("from Student"); List students = query.list(); for (Iterator iter = students.iterator();iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } //如果使用iterate进行查询 //因为list操作已经将对象加载到了session的一级缓存,所以 //再使用iterate操作的时候,它先会发出查询id列表的查询语句 //再根据id到缓存中获取相关的数据 //只有再缓存中找不到相关数据的情况下,才会再次发出sql进行查询 Iterator studentsIter = query.iterate(); while (studentsIter.hasNext()) { Student student = (Student)studentsIter.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testQueryWithListAndList() { Session session = null; try { session = HibernateUtils.getSession(); Query query = session.createQuery("from Student"); List students = query.list(); for (Iterator iter = students.iterator();iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } //再次发出发出sql //在默认情况下,list每次都会向数据库发出查询对象数据的sql, //除非配置了查询缓存,所以下面的list()操作,虽然在session已经有了 //对象缓存数据,但list()并不理会这个中缓存,而再次发出查询语句进行查询 students = query.list(); for (Iterator iter = students.iterator();iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } }
详细查看注释部分代码.
以后对查询的性能优化..
发表评论
-
Hibernate抓取策略二
2010-05-11 17:56 1085在Classes与Student一对多映射中,我们将Set里面 ... -
Hibernate抓取策略一
2010-05-11 16:29 1323抓取策略指多表关联查询的时候,Hibernate会发出多条sq ... -
Hibernate查询缓存
2010-05-11 01:15 1618二级缓存中,如果不设置“查询缓存”,那么hibernate只会 ... -
Hibernate所需完整类库
2010-05-11 01:08 892附件为最新配置Hibernate所需的包. 由来: 一、下 ... -
Hibernate 二级缓存缺少包出现的异常
2010-05-10 23:29 2338由于二级缓存使用的包org.hibernate.cache.E ... -
转:Hibernate性能优化之二级缓存
2010-05-10 17:28 1142http://chenhongbin007.blog.163. ... -
Hibernate lazy加载FOR 单端关联
2010-05-10 00:54 1324Hibernate单端关联懒加载策略:即在<one-to ... -
Hibernate lazy加载FOR Connection
2010-05-10 00:28 1199Hibernate集合属性的懒加载策略: 在集合属性上, ... -
Hibernate lazy加载FOR Class
2010-05-09 23:51 1057lazy策略可以用在: * <class>标签 ... -
Hibernate性能优化:二级缓存
2010-05-06 16:48 1070hibernate二级缓存 定义步骤: 1、打开缓存, ... -
Hibernate性能优化:一级缓存
2010-05-06 16:33 1126一级缓存与session周期一致,二级缓存与sessionFa ... -
Hibernate悲观锁与乐观锁及事务管理机制
2010-05-06 11:57 1197引用: 悲观锁与乐观锁: http://www.iteye ... -
Hibernate学习笔记博客
2010-05-06 11:32 725网上也有人自学hibernate的笔记 http://hi. ... -
Hibernate与EJB的区别
2010-05-05 18:09 878Hibernate不支持分布式应用 -
Hibernate对象状态
2010-05-05 17:48 1775Hibernate对象有三种状态: 瞬时状态(Transie ... -
Hibernate HQL示例十二:DML更新、删除及与Hibernate持久化更新
2010-05-05 16:42 1977DML更新及删除 示例: package com.bjsx ... -
Hibernate HQL示例十一:分页查询
2010-05-05 16:21 1142分页查询: select * from t_student ... -
Hibernate HQL示例十:统计查询
2010-05-05 15:57 2114统计函数的使用 count(*) 等 package co ... -
Hibernate HQL示例九:连接查询
2010-05-05 15:38 3539inner join left out join rig ... -
Hibernate HQL示例八:查询对象导航及Implicit Join
2010-05-05 10:32 1689通过Student对象导航到class对象的id 如下: ...
相关推荐
【标题】"Hibernate教程24_Hibernate的补充_list与iterator" 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。本教程将重点讲解在使用Hibernate时,如何处理查询结果集合...
- **Query.list()** 和 **Query.iterate()** 的主要区别在于返回类型和查询策略: - **Query.list()** 直接查询数据库,并将结果存储在内存中,适合数据量较小的情况。 - **Query.iterate()** 则会先获取ID列表,...
- **隐式内连接与迫切内连接区别**: - 内连接返回的是`Object[]`数组对象,里面存储的是结果集中返回的多个对象。 - 迫切内连接返回的是`from`后面的对象,将`fetch`关键字后面的对象读取并填充到`from`后面的...
- 区别使用`list()`与`iterate()`方法遍历查询结果集。 - 理解一级缓存、二级缓存与查询缓存的区别及使用场景。 - 事务并发处理的最佳实践。 以上知识点覆盖了从入门到进阶的各个方面,为学习Hibernate提供了...
《深入理解Hibernate二级缓存机制》 在Java的持久化框架Hibernate中,缓存机制扮演着重要的角色,尤其是在处理大量数据时,它可以显著提高应用程序的性能。然而,许多人对Hibernate的二级缓存可能存在误解,因此...
本篇文章主要介绍初学者在学习Hibernate时会遇到的基础语句,通过简单的示例帮助读者快速上手并理解Hibernate的基本操作。 #### 二、基础语句详解 ##### 1. 迭代器方式(Iterator) - **应用场景**:当需要遍历...
QBE允许通过一个实体示例来构建查询条件,从而获取与示例相匹配的对象集合。例如: ```java Cat exampleCat = new Cat(); exampleCat.setName("Tom"); List<Cat> cats = session.createCriteria(Cat.class) .add...
- `list()`、`uniqueResult()`、`iterate()`等方法处理查询结果。 3. **更新(Update)** - 修改对象的属性,然后调用`Session`的`update()`方法将对象的状态同步到数据库。 - 或者,先`load()`或`get()`对象,...
2. **Hibernate Query Language (HQL)** - **标准查询**: - `String sql = "from Customer as customer where customer.age = 20";` - `Query q = session.createQuery(sql);` - **选择特定字段**: - `String...
6. **load(Class entityClass, Serializable id)**:与`get`类似,但当找不到对应的记录时,不会抛出异常而是返回`null`。 - **示例**: ```java Long id = 1L; Teacher teacher = (Teacher) hibernateTemplate....
本文将详细介绍如何通过Hibernate进行批量删除,并探讨其背后的工作原理与优化技巧。 #### 二、批量删除的基本方法 1. **基本思路**:批量删除可以通过执行一次或多条SQL语句来完成。通常情况下,为了提高效率,...
#### 二、Hibernate基础 ##### 1. Hibernate入门 Hibernate是一种ORM框架,它允许开发者将Java对象直接映射到关系型数据库的表中,从而简化了数据库操作的过程。持久化是指将瞬时数据转化为持久状态的过程,即把内存...