Hibernate学习笔记(二):Hibernate查询

 上一节讲了Hibernate的配置,这一节介绍下Hibernate的一些查询。

  1、Hibernate中的几种查询:

  •   a、OID查询:根据id查询,get和load;
  •   b、SQL查询:

          SQLQuery;

          Session中的dowork方法,它可以拿到Connection

  • c、HQL查询:使用HQL语句查询数据库;
  • d、QBC查询:使用Criteria对象查询数据库;

2、hibernate中的Query对象:

  它是hibernate中HQL查询方式

  • a、如何获得该对象;

        session对象的方法

  • b、涉及到对象和方法;

        createQuery(String hql)

  • c、方法参数中的含义:

       SQL:select '数据库中的列名' from '数据库的表名'

       HQL:select '类中的属性名' from '类名'

       HQL语句,是把sql语句的表名换成类名,把字段名换成实体类中的属性名称

3、hibernate对象三种状态:

  • 瞬时状态(临时状态):没有OID、与session没关系;
  • 持久化状态:有OID,与session有关系,只有持久化的状态才有一级缓存的概念;
  • 托管状态:有OID,与session没关系;
  • 删除状态:有OID,和session有关系,同时调用了删除方法,即将从数据库中删除,还没有提交;

4、几个Hibernate查询的Demo

//基本查询
public void test1(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Query对象
	Qurery query=s.createQuery("from 类名称");
	//获取结果集
	List list=query.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}
//条件查询
public void test2(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Query对象
	Qurery query=s.createQuery("from 类名称 where 类属性1 like :aaa and 属性名2= :bbb ");
	query.setParameter("aaa","%xx%");//aaa与HQL中aaa对应,右边是赋值
	query.setParameter("bbb","xxxx");
	//获取结果集
	List list=query.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}
//排序查询
//在HQL语句添加order by就可以了(desc)

//分页查询
public void test3(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Query对象
	Qurery query=s.createQuery("from 类名称");
	//这俩个方法不受数据库影响
	//也就是说,mysql、Oracle等同样受用
	query.setFirstResult(2);//设置查询的开始记录索引;
	query.setMaxResults(2)//设置每次查询条数;
	//获取结果集
	List list=query.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}
//统计查询
public void test4(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Query对象
	Qurery query=s.createQuery("from 类名称");
	Long count =(Long) query.uniqueResult();//当返回结果唯一时成功,不唯一时出错
	
	System.out.println(count);

	tx.commit();
}
//统计查询
public void test5(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Query对象
	Qurery query=s.createQuery("select new 你的包名路径(属性名1,属性名2) from 类名称");
	//获取结果集
	List list=query.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}

5、用QBC进行查询的Demo

   QBC,Query By Criteria,它是一种面向对象的查询方式,它能把生成语句的过程全部融入到方法当中了;

//基本查询
public void test1(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Criteria对象
	Criteria c=s.createCriteria(类名.class);
	//获取结果集
	List list=c.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}
//条件查询
public void test2(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Criteria对象
	Criteria c=s.createCriteria(类名.class);
	c.add(Restrictions.eq("属性名","属性值"));
	c.add(Restrictions.like("属性名","属性值"));
	//获取结果集
	List list=c.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}
//排序查询
public void test3(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Criteria对象
	Criteria c=s.createCriteria(类名.class);
	
	c.addOrder(Order.desc("custId"));
	//获取结果集
	List list=c.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}

//分页查询
public void test4(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Criteria对象
	Criteria c=s.createCriteria(类名.class);
	//这俩个方法不受数据库影响
	//也就是说,mysql、Oracle等同样受用
	c.setFirstResult(2);//设置查询的开始记录索引;
	c.setMaxResults(2)//设置每次查询条数;
	//获取结果集
	List list=c.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}
//统计查询
public void test4(){
	//获取当前Session
	Session s=HibernateUtil.getCurrentSession();
	//创建事务
	Transaction tx=s.beginTransaction();
	//获取Criteria对象
	Criteria c=s.createCriteria(类名.class);
	
	c.setProjection(Projection.count("custId");
	List list=c.list();
	for(Object o:list)
	{
		System.out.println(o);
	}
	tx.commit();
}

  最后,Criteria还一种查询,叫做离线查询,离线查询解决的弊端是:当用Criteria做查询时,Servlet出现持久层的session和事务对象,这是不允许的,这个时候得用离线操作,DetachedCriteria 不需要获取session。Demo如下:

public void test(){
	
	//获取离线对象,不需要session
	DetachedCriteria dc=DetachedCriteria(类名.class);

	dc.add(Restrictions.eq("属性名","属性值"));
	dc.add(Restrictions.like("属性名","属性值"));
	
	List list=testService(dc);
	for(Object o:list)
	{
		System.out.println(o);
	}
}

private List testService(DetachedCriteria dc)
{
	Session s=null;
	Transaction tx
	try
	{
		s=HibernateUtil.getCurrentSession();
		tx=s.beginTransaction();
		testDao(dc);
		tx.commit();
		return list;
	}
	catch(Exception e)
	{
		tx.rollback();
	}
	return null;
}
private List testDao(DetachedCriteria dc)
{
	Session s=HibernateUtil.getCurrentSession();
	Criteria c=dc.getExecutableCriteria(s);
	return c.lis();
}

你可能感兴趣的:(Hibernate学习笔记(二):Hibernate查询)