条件查询
三个关键类:
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 该类是用来产生查询条件的类
注:代码中红色部分标注出来的内容。
再注:转载请注明出处,谢谢!
浙公网安备 33010602011771号