- 浏览: 448201 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
飞天奔月:
我来个简单点的代码 使用 LinkedHashSetpubli ...
ArrayList去重 -
飞天奔月:
public static <T> List< ...
ArrayList去重 -
aaron7524:
事务隔离级别 -
月陨殇:
wlh269 写道rswh110 写道lz内容写的不错,就是略 ...
事务隔离级别 -
lnx1824:
我的更奇怪,在本地静态的可以,放jetty里的页面后就不然,都 ...
JS得到上传图片尺寸
实体对象查询(重要)
* N+1问题,在默认情况下使用query.iterate查询,有可能出现N+1问题,所谓的N+1
是查询对象的时候发出了N+1条sql语句
1:首先发出一条查询id列表的sql
N:根据id列表发出n条查询语句
* list和iterate的区别?
* list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据
* iterate在默认情况下有N+1问题,如果缓存中存在数据那么会根据id到缓存获取数据
也就说iterate是利用缓存的
参见:SimpleObjectQueryTest1.java,SimpleObjectQueryTest2.java
* N+1问题,在默认情况下使用query.iterate查询,有可能出现N+1问题,所谓的N+1
是查询对象的时候发出了N+1条sql语句
1:首先发出一条查询id列表的sql
N:根据id列表发出n条查询语句
* list和iterate的区别?
* list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据
* iterate在默认情况下有N+1问题,如果缓存中存在数据那么会根据id到缓存获取数据
也就说iterate是利用缓存的
参见:SimpleObjectQueryTest1.java,SimpleObjectQueryTest2.java
package com.wlh.hibernate; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.hibernate.Query; import org.hibernate.Session; public class SimpleObjectQueryTest1 extends TestCase{ public void testQuery1(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //可以省略select语句 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="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery2(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //可以省略select语句,实体类可以加别名 Query query=session.createQuery("from Student s"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery3(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //可以省略select语句,实体类可以用as加别名 Query query=session.createQuery("from Student as s"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery4(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //使用select查询实体对象,必须采用别名 Query query=session.createQuery("select s from Student as s"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } } package com.wlh.hibernate; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.hibernate.Query; import org.hibernate.Session; public class SimpleObjectQueryTest2 extends TestCase{ /** * 发出list查询 */ public void testQuery1(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); /** * 采用list查询将会发出一条查询语句,取得Student数据 * select student0_.id as id1_, student0_.name as name1_, * student0_.createTime as createTime1_, student0_.classesid as classesid1_ * from t_student student0_ * */ 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="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 出现N+1问题 * * 发出查询id类表的sql语句: * select student0_.id as col_0_0_ from t_student student0_ * * 依次发出根据id查询Student的sql语句: * select student0_.id as id1_0_, student0_.name as name1_0_, * student0_.createTime as createTime1_0_, student0_.classesid as classesid1_0_ * from t_student student0_ where student0_.id=? * */ public void testQuery2(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query=session.createQuery("from Student"); Iterator iter=query.iterate(); while(iter.hasNext()){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 先发出list查询,再发出iterate查询 */ public void testQuery3(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query=null; 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="+student.getName()); } System.out.println("==============================="); /** * 不会出新N+1问题 * * 因为list操作已经将对象放到了一级缓存中(session级缓存),所以在使用Iterate操作的时候 * 它会发出根据id查询的语句,取得id列表,再根据id到缓存中获取数据,只有在缓存中找不到相应的数据 * 才会发出sql语句到数据库中查询 */ query=session.createQuery("from Student"); Iterator iter=query.iterate(); while(iter.hasNext()){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 发出两次list查询 */ public void testQuery4() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); List students = session.createQuery("from Student").list(); for (Iterator iter =students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } System.out.println("------------------------------------------------"); /** * 再次发出查询语句 * * 在默认情况下list每次都会向数据库发出查询对象的sql,除非配置了查询缓存,所以下面的list * 操作,虽然在一级缓存中已经有了对象数据,list不会利用缓存中的数据,而再次发出查询sql * * list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据 */ students = session.createQuery("from Student").list(); for (Iterator iter =students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
发表评论
-
java开发实战视频详解
2017-07-02 08:09 492java开发实战视频详解 链接: http://pan.bai ... -
什么样的数据适合存放到第二级缓存中
2009-04-11 17:15 1679(一)Hibernate的二级缓存策略的一般过程如下: 1) ... -
hibernate二级缓存攻略
2009-04-10 18:13 945http://www.iteye.com/topic/1890 ... -
关于hibernate缓存的问题
2009-04-10 18:12 10121. 关于hibernate缓 ... -
get方法和load方法区别
2009-04-03 18:38 1351hibernate中get方法和load方法的根本区别在于:如 ... -
Hibernate性能调优(重点理解)
2009-03-02 12:48 1233一。 inverse = ? inv ... -
hibernate查询缓存
2009-03-02 11:17 3725hibernate查询缓存 查询缓存是缓存普通属性结果集 ... -
浅谈hibernate性能优化的几点建议
2009-02-21 11:15 972浅谈hibernate性能优化的几点建议 1、针对orac ... -
Hibernate抓取策略
2009-02-17 12:37 1332hibernate抓取策略(单端代理的批量抓取) 保持< ... -
Hibernate二级缓存的使用
2009-02-17 12:22 10001.加入ehcase.xml文件; 2.在配置文件中加入如下代 ... -
Hibernate一级缓存
2009-02-03 02:57 882一级缓存生命周期很短,它session的生命周期一致,一级缓存 ... -
HQL (十) 统计查询
2009-02-02 18:28 2313统计查询(重要) 参见:StatQueryTest.java ... -
HQL (九) 连接查询
2009-02-02 18:25 6079连接查询(重要) * 内连接 * 外连接(左连接/右连接) ... -
HQL (八) 对象导航查询
2009-02-02 13:17 2070对象导航查询,在hql中采用.进行导航(重要) 参见:Obj ... -
HQL (七) 分页查询
2009-02-02 13:05 1149分页查询(重要) * setFirstResult(),数据 ... -
HQL (六) 查询过滤器
2009-02-02 12:22 1806查询过滤器 设置了查 ... -
HQL (五) 外置命名查询(sql语句单独保存起来)
2009-02-02 12:04 2255外置命名查询 * 在要查询对象对应的映射文件(这里是stud ... -
HQL (四) 原生sql查询
2009-02-02 11:27 1828hibernate也支持直接sql进行查询 参见:SqlQu ... -
HQL (三) 条件查询
2009-02-02 11:13 2551条件查询(重要) * 可以采用拼字符串的方式传递参数 * ... -
HQL (一) 简单属性查询
2009-02-02 01:13 1887简单属性查询(重要) * 单一属性查询,返回结果集是属性列表 ...
相关推荐
HQL通过new的方式可以返回一个新的实体类,比如说上面通过new User(id,name)方式将id,name返回给User,要求User必须包含一个相对应的构造函数,否则会抛出异常,同时我们还有应该给User指定一个默认的构造函数,否则...
1、HQL是面向对象的,所以HQL与数据库无关 2、HQL最终也会生成SQL,也就是说 HQL使用范围是<SQL的范围 3、HQL是由query对象获得。 hql sql 面向对象 面向结构(表) 操作的是实体类 ,类属性 表,表列段 ...
2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 ...
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...
它可以使用不同的缓存实现,如 EhCache 、 JBossCache 、 OsCache 等 (二级缓存是缓存实体对象的) 还有一个类型的 CACHE 就是 QueryCache . 它的作用就是缓存一个 Query 以及 Query 返回对象的 Identifier 以及...
2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 ...
2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 ...
2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 ...
4.3.3 给查询命名实体 4.3.4 声明包名称 4.3.5 用引号把SQL标识符括起来 4.3.6 实现命名约定 4.4 细粒度的模型和映射 4.4.1 映射基础属性 4.4.2 映射组件 4.5 小结 第5章 继承和...
2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4.3.1. 访问类型 2.4.3.2. 公式 2.4.3.3. 类型 2.4.3.4. 索引 2.4.3.5. @Parent ...
1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,...
05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_完成CRUD实验并回顾和补充细节知识(上)...
测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 主键生成器Generator 6 多对一, 一对一, 一对多, 多对多 7 hibernate多对一关联映射...
2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4.3.1. 访问类型 2.4.3.2. 公式 2.4.3.3. 类型 2.4.3.4. 索引 2.4.3.5. @Parent 2.4.3.6. ...
2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4.3.1. 访问类型 2.4.3.2. 公式 2.4.3.3. 类型 2.4.3.4. 索引 ...
第二章: 面向对象概述 15 学习目标 15 面向对象(Object Oriented) 16 面向对象的主要特性 18 抽象(Abstraction) 18 封装(Encapsulation): 19 多态(Polymorphism) 20 面向对象的优点 22 面向对象的分析、设计和编程...
第12章 HQL查询语言 第13章 Hibernate的高级特性 第14章 Hibernate结合JSP使用 第四篇 iBatis篇 第15章 iBatis概述 第16章 iBatis的特性 第17章 JSP、Servlet和iBatis结合使用 第五篇 XML篇 第18章 ...
了解一下整个对象图如何工作,讨论级联持久化,批量操作,懒惰查询和贪婪查询。 第五章深入研究NHibernate如何严格控制数据库的各种事务。我们在本章中讨论一个业务模型及实例来展示如何自动进行版本控制和锁控制...
14.1.2. 实体查询(Entity queries) 14.1.3. 处理关联和集合类(Handling associations and collections) 14.1.4. 返回多个实体(Returning multiple entities) 14.1.4.1. 别名和属性引用(Alias and property ...