`
wlh269
  • 浏览: 448201 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HQL (二) 实体对象查询

阅读更多
实体对象查询(重要)  
   * 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);
		}
	}			
	
}

分享到:
评论

相关推荐

    Hibernate HQL详解.docx

    HQL通过new的方式可以返回一个新的实体类,比如说上面通过new User(id,name)方式将id,name返回给User,要求User必须包含一个相对应的构造函数,否则会抛出异常,同时我们还有应该给User指定一个默认的构造函数,否则...

    hibernateのHQL

    1、HQL是面向对象的,所以HQL与数据库无关 2、HQL最终也会生成SQL,也就是说 HQL使用范围是<SQL的范围 3、HQL是由query对象获得。 hql sql 面向对象 面向结构(表) 操作的是实体类 ,类属性 表,表列段 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     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概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Hibernate_二级缓存总结

    它可以使用不同的缓存实现,如 EhCache 、 JBossCache 、 OsCache 等 (二级缓存是缓存实体对象的) 还有一个类型的 CACHE 就是 QueryCache . 它的作用就是缓存一个 Query 以及 Query 返回对象的 Identifier 以及...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    Hibernate实战(第2版 中文高清版)

     4.3.3 给查询命名实体   4.3.4 声明包名称   4.3.5 用引号把SQL标识符括起来   4.3.6 实现命名约定   4.4 细粒度的模型和映射   4.4.1 映射基础属性   4.4.2 映射组件   4.5 小结   第5章 继承和...

    hibernate annotation帮助文档

    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 ...

    Spring面试题

    1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,...

    传智播客李勇hibernate源码1-20课

    05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_完成CRUD实验并回顾和补充细节知识(上)...

    hibernate学习笔记

    测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 主键生成器Generator 6 多对一, 一对一, 一对多, 多对多 7 hibernate多对一关联映射...

    hibernate annotation 中文文档

    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. ...

    Hibernate Annotations 中文文档

    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. 索引 ...

    Java语言基础下载

    第二章: 面向对象概述 15 学习目标 15 面向对象(Object Oriented) 16 面向对象的主要特性 18 抽象(Abstraction) 18 封装(Encapsulation): 19 多态(Polymorphism) 20 面向对象的优点 22 面向对象的分析、设计和编程...

    Java数据库技术详解 DOC简版

    第12章 HQL查询语言 第13章 Hibernate的高级特性 第14章 Hibernate结合JSP使用 第四篇 iBatis篇 第15章 iBatis概述 第16章 iBatis的特性 第17章 JSP、Servlet和iBatis结合使用 第五篇 XML篇 第18章 ...

    NHibernate in Action by Christian Bauer

    了解一下整个对象图如何工作,讨论级联持久化,批量操作,懒惰查询和贪婪查询。 第五章深入研究NHibernate如何严格控制数据库的各种事务。我们在本章中讨论一个业务模型及实例来展示如何自动进行版本控制和锁控制...

    NHibernate参考文档 2.0.0 chm

    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 ...

Global site tag (gtag.js) - Google Analytics