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);
			}
		}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值