条件查询

三个关键类:

  1.Criteria: 代表一次查询;

  2.Criterion:代表一个查询条件。

  3.Restrictions:代表查询条件的工具类。

2.使用步骤:

   1.先用Session创建Criteria对象;

   2.使用Restrictions的静态方法创建Criterion查询条件;

   3.向Criteria查询中添加Criterion查询条件;

   4.执行Criteria的list()或者uniqueResult()方法返回结果集。

示例:

package lee;

import org.crazyit.app.domain.Enrolment;
import org.crazyit.app.domain.Student;
import org.hibernate.*;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

import java.util.*;

public class CriteriaTest
{
	public static void main(String[] args)
	{
		CriteriaTest criteriaTest = new CriteriaTest();
		criteriaTest.query();
		criteriaTest.queryWithJoin();
		criteriaTest.queryWithFecth();
		HibernateUtil.sessionFactory.close();
	}
	private void query()
	{
		//打开Session和事务
		Session session = HibernateUtil.currentSession();
		Transaction tx = session.beginTransaction();
		//使用createCriteria开始条件查询
		
		List l = session.createCriteria(Student.class)
			//根据Student的属性进行过滤数据
			.add( Restrictions.gt("name" , "a"))
			.list();
		Iterator it = l.iterator();
		System.out.println("=====简单条件查询获取所有学生记录=====");
		while (it.hasNext())
		{
			Student s = (Student)it.next();
			System.out.println(s.getName());
			Set enrolments = s.getEnrolments();
			Iterator iter = enrolments.iterator();
			System.out.println("=====获取-" + s.getName()
				+ "-的选课记录=====");
			while(iter.hasNext())
			{
				Enrolment e = (Enrolment)iter.next();
				System.out.println(e.getCourse().getName());
			}
		}
		tx.commit();
		HibernateUtil.closeSession();
	}
	//示范根据关联实体的属性过滤数据
	private void queryWithJoin()
	{
		//打开Session和事务
		Session session = HibernateUtil.currentSession();
		Transaction tx = session.beginTransaction();
		//使用createCriteria开始条件查询
		List L = session.createCriteria(Student.class)
			//此处增加限制条件必须是Student已经存在的属性
			.add( Restrictions.gt("studentNumber" , 20050231))
			//如果要增加对Student的关联类的属性的限制
			//则必须重新createCriteria()
			//如果此关联属性是集合,则只要集合里任意一个对象的属性满足下面条件即可
//			.createCriteria("enrolments")
//			.add( Restrictions.gt("semester" , 2))
			.createAlias("enrolments", "en")
			.add( Restrictions.gt("en.semester" , 2))
			.list();
		Iterator it = L.iterator();
		System.out.println("=====关联条件查询获取所有学生记录=====");
		while (it.hasNext())
		{
			Student s = (Student)it.next();
			System.out.println(s.getName());
			Set enrolments = s.getEnrolments();
			Iterator iter = enrolments.iterator();
			System.out.println("=====获取-" + s.getName()
				+ "-的选课记录=====");
			while(iter.hasNext())
			{
				Enrolment e = (Enrolment)iter.next();
				System.out.println(e.getCourse().getName());
			}
		}
		tx.commit();
		HibernateUtil.closeSession();
	}
	//示范根据关联实体的属性过滤数据
	private void queryWithFecth()
	{
		//打开Session和事务
		Session session = HibernateUtil.currentSession();
		Transaction tx = session.beginTransaction();
		//使用createCriteria开始条件查询
		List l = session.createCriteria(Student.class)
			//此处增加限制条件必须是Student已经存在的属性
			.add( Restrictions.gt("studentNumber" , 20050231))
			.setFetchMode("enrolments", FetchMode.JOIN)
			.list();
		tx.commit();
		HibernateUtil.closeSession();
		Iterator it = l.iterator();
		System.out.println("=====启用预初始化的条件查询获取所有学生记录=====");
		while (it.hasNext())
		{
			Student s = (Student)it.next();
			System.out.println("少妇白洁:");
			System.out.println(s.getName());
			//Session关闭后访问Student的关联实体
			Set enrolments = s.getEnrolments();
			System.out.println(enrolments);
		}
	}
}




package lee;

import org.hibernate.*;
import org.hibernate.cfg.*;

/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */	
public class HibernateUtil
{
	public static final SessionFactory sessionFactory;
	
	static
	{
		try
		{
			//采用默认的hibernate.cfg.xml来启动一个Configuration的实例
			Configuration configuration = new Configuration()
				.configure();
			//由Configuration的实例来创建一个SessionFactory实例
			sessionFactory = configuration.buildSessionFactory();
		}
		catch (Throwable ex)
		{
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}
	
	//ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步	
	public static final ThreadLocal<Session> session
		= new ThreadLocal<Session>();
	
	public static Session currentSession()
		throws HibernateException
	{
		Session s = session.get();
		//如果该线程还没有Session,则创建一个新的Session
		if (s == null)
		{
			s = sessionFactory.openSession();
			//将获得的Session变量存储在ThreadLocal变量session里
			session.set(s);
		}
		return s;
	}
	
	public static void closeSession()
		throws HibernateException 
	{
		Session s = session.get();
		if (s != null)
			s.close();
		session.set(null);
	}
}

  

 

   Criteria  add(Criterion  criterion)方法中传递的参数就是查询条件CRiterion 该类是用来产生查询条件的类

 注:代码中红色部分标注出来的内容。

     再注:转载请注明出处,谢谢!

posted @ 2016-09-25 13:46  西红柿鸡蛋面  阅读(129)  评论(0)    收藏  举报