`
jessen163
  • 浏览: 466686 次
  • 性别: Icon_minigender_1
  • 来自: 潘多拉
社区版块
存档分类
最新评论

Hibernate查询 load与get的区别及其它查询测试

阅读更多
一、测试load与get

默认配置下,load将实现懒加载,即只有当对象被使用的时候才发出sql,而get将立刻发出sql
如下:
POJO:
package com.lwf.hibernate;

import java.util.Date;

public class Doc {
	private String id;
	private String name;
	private Date createDate;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

}



配置文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	
	<class name="com.lwf.hibernate.Doc">
		<id name="id">
			<generator class="uuid"></generator>
		</id>
		<property name="name"></property>
		<property name="createDate"></property>
	</class>
	<query name="HqlName">
		<![CDATA[select id,name from Doc]]>
	</query>
	
	<query name="HqlNameAll">
		<![CDATA[from Doc order by name desc]]>
	</query>
	
	<query name="HqlNameAllParam">
		<![CDATA[from Doc where name=:name]]>
	</query>
	
	 
</hibernate-mapping>	


测试代码:

package com.lwf.hibernate;

import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class DocSessionTest {

	public static void main(String[] args) {

//			testSave();
			testGet();
			//testLoad();
	}
	
	
	public static void commit(Session session){
		try {
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
	}
	public static void closeSession(Session session){
		
		if(session.isOpen()){
			session.close();
		}
	}
	
	public static Session getSession(){
		Session session = null;
		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		session = factory.openSession();
		return session;
	}
	
	public static void testSave(){
		Session session = null;
		session = getSession();
		session.beginTransaction();
		Doc doc = new Doc();
		session.save(doc);
		
		doc.setName("gdgdgd");
		doc.setCreateDate(new Date());
		session.flush();
		commit(session);
		closeSession(session);
	}

	public static void testGet(){
		Session session = null;
		session = getSession();
		session.beginTransaction();
		Doc doc = (Doc)session.get(Doc.class, "402880f62861314e0128613157060001");
		//get会立刻发出查询语句,而load则不会立刻发出查询,直到后面有使用doc如doc.setName才进行查询.
		//System.out.println(doc.getName());
		//doc.setName("t");
		session.flush();
		commit(session);
		closeSession(session);
	}
	
	public static void testLoad(){
		Session session = null;
		session = getSession();
		session.beginTransaction();
		//get会立刻发出查询语句,而load则不会立刻发出查询,直到后面有使用doc如doc.setName才进行查询.
		//load方法实现了lazy即懒模式
		Doc doc =(Doc)session.load(Doc.class, "40288e81280b1db101280b1db61c0001");
		//System.out.println(doc.getName());
		//doc.setName("t");
		session.flush();
		commit(session);
		closeSession(session);
	}
}



运行代码会发现load与get的不同。

另外,如果没有查询到数据,get会返回null,而load回返回异常


二、下例中对HQL的各种情况的查询,删除进行演示

package com.lwf.hibernate;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class DocSqlTest {

	public static void main(String[] args) {

		Configuration cfg = new Configuration().configure();
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		session.beginTransaction();
		
		//where子句中使用值传递
		String sqlStr = "from Doc where name ='we'";
		getDocList(session,sqlStr);
		
		//where子句中使用参数传递,参数通过query.setString(paramName,paramVal);设置
		sqlStr = "from Doc where name =:name";
		Object[] object = new Object[2];
		object[1] = "yeeey";
		getDocList(session,sqlStr,object);
		
		//where子句中使用参数传递,参数通过query.setProperties(object);设置
		sqlStr = "from Doc where name =:name";
		Doc doc = new Doc();
		doc.setName("Lisi1");
		getDocList(session,sqlStr,doc);
		
		//通过sqlStr字符串设定的查询条件进行查询
		sqlStr = "select id,name from Doc";
		getDocObject(session,sqlStr);
		
		//通过从配置文件中获得查询语句进行查询
		getDocBynameQuery(session);
		
		//get getObjectBynameQuery
		getObjectBynameQuery(session);
		
		//get getDocBynameQueryParam
		getDocBynameQueryParam(session);
		
		//只获得一笔记录
		sqlStr = "from Doc";
		getSingleData(session,sqlStr);
		
		//通过改变查询条件进行查询。
		sqlStr = "from Doc where lower(name)='df'";
		getDocList(session,sqlStr);
		
		sqlStr = "from Doc where name not in ('we','df')";
		getDocList(session,sqlStr);
		
		sqlStr = "from Doc where name like '_e%'";
		getDocList(session,sqlStr);
				
		//获得总记录数
		sqlStr = "select count(*) from Doc";
		Long l = (Long)session.createQuery(sqlStr).uniqueResult();
		System.out.println(l);
				
		//测试group by子名
		sqlStr = "select name from Doc group by name having name is not null";
		getDocName(session,sqlStr);
		
		session.getTransaction().commit();
		session.flush();
		if(session.isOpen()){
			session.close();
		}		
		
		//测试删除表记录
		session = factory.openSession();
		session.beginTransaction();
		Query query = session.createQuery("delete from Doc");
		query.executeUpdate();
		session.getTransaction().commit();
		if(session.isOpen()){
			session.close();
		}		
	}
	
	public static void getSingleData(Session session,String sqlStr){
		Query query = session.createQuery(sqlStr);
		query.setFirstResult(0);
		query.setMaxResults(1);
		Object object = query.uniqueResult();
		System.out.println(((Doc)object).getId() + " : " + ((Doc)object).getName());
	}
	
	public static void getDocBynameQueryParam(Session session){
		Query query = session.getNamedQuery("HqlNameAllParam");
		query.setString("name", "we");
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Doc doc = (Doc)list.get(i);
			String id = doc.getId();
			String name = doc.getName();
			System.out.println(id +" : "+ name);
		}
	}
	
	public static void getDocBynameQuery(Session session){
		Query query = session.getNamedQuery("HqlNameAll");
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Doc doc = (Doc)list.get(i);
			String id = doc.getId();
			String name = doc.getName();
			System.out.println(id +" : "+ name);
		}
	}
	

	public static void getObjectBynameQuery(Session session){
		Query query = session.getNamedQuery("HqlName");
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Object[] object = (Object[])list.get(i);
			System.out.println(object[0] + " <:> " + object[1]);
		}
	}
	
	public static void getDocList(Session session,String sqlStr,Object object){
		Query query = session.createQuery(sqlStr);
		query.setProperties(object);
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Doc doc = (Doc)list.get(i);
			String id = doc.getId();
			String name = doc.getName();
			System.out.println(id +" : "+ name);
		}
		
	}
	
	public static void getDocList(Session session,String sqlStr, Object[] parameter){
		Query query = session.createQuery(sqlStr);
		query.setString("name", (String)parameter[1]);
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Doc doc = (Doc)list.get(i);
			String id = doc.getId();
			String name = doc.getName();
			System.out.println(id +" : "+ name);
		}
		
	}
	
	public static void getDocList(Session session,String sqlStr){
		Query query = session.createQuery(sqlStr);
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Doc doc = (Doc)list.get(i);
			String id = doc.getId();
			String name = doc.getName();
			System.out.println(id +" : "+ name);
		}
		
	}
	
	public static void getDocObject(Session session,String sqlStr){
		
		Query query = session.createQuery(sqlStr);
		List list = query.list();
		for (int i = 0; i < list.size(); i++) {
			Object[] object = (Object[])list.get(i);
			System.out.println(object[0] + " <:> " + object[1]);
		}
	}
	
	public static void getDocName(Session session,String sqlStr){
			
			Query query = session.createQuery(sqlStr);
			List list = query.list();
			for (int i = 0; i < list.size(); i++) {
				String name = (String)list.get(i);
				System.out.println(name);
			}
		}

}


分享到:
评论

相关推荐

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    hibernate get load区别

    ### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...

    hibernate中get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...

    Hibernate的get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...

    hibernate中get和load的区别共5页.pdf

    标签“hibernate中get和lo”暗示了标签可能被意外截断,但我们可以推断完整标签可能是“hibernate中get和load的区别”。 在实际开发中,选择使用`get`还是`load`取决于具体需求。如果需要立即从数据库中获取对象,...

    session的get与load比较

    本文将深入探讨`get`与`load`两种方法的区别及其应用场景。 #### 一、基本概念 在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存...

    Hibernate中load方法与get方法的区别

    在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的区别: 1. **返回结果对比**: - `load`方法如果找不到对应的记录,会抛出`org.hibernate....

    Hibernate查询语言HQL.PPT

    2. 通过标识符检索:使用 session.get() 方法或 session.load() 方法根据标识符检索对象。 3. 使用 HQL 检索对象:使用 Hibernate 查询语言 HQL 检索对象。 4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的...

    Hibernate中get()和load()的区别.docx

    在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...

    Hibernate 框架测试版本

    而`get()`和`load()`用于根据主键获取对象,`update()`和`merge()`用于更新对象,`delete()`则用于删除对象。 6. **HQL与Criteria查询** Hibernate 提供了自己的SQL方言——HQL(Hibernate Query Language),它是...

    Hibernate查询解决方案

    本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...

    hibernate 简单测试

    - 通过Session创建或加载实体,调用save()、update()、delete()、get()、load()等方法 - 提交事务,关闭Session 对于proxool的整合,我们需要在hibernate.cfg.xml中添加proxool的相关配置,如pool_size、driver_...

    hibernate查询缓存1

    在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...

    hibernate查询与缓存

    Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get...

    Hibernate中Session.get()方法和load()方法的详细比较

    Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...

    hibernate公共查询

    - `findById(id)`: 根据ID查询单个对象,利用`Session`的`get()`或`load()`方法。 - `findByExample(entity)`: 基于实例属性的查询,`Session`的`createCriteria()`可以接受对象实例,根据其属性构建查询条件。 ...

    Hibernate查询详解

    ### Hibernate查询:get()与load() #### get()与load()的区别 - **get()** 方法在一级缓存中查找实体,如果找不到,则直接查询数据库,不会检查二级缓存。这意味着,当一级缓存中不存在所需数据时,get()会立即...

Global site tag (gtag.js) - Google Analytics