DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。
配置实体类Student 以及Student.hbm.xml映射文件
package sun.domain;
import java.util.*;
public class Student
{
private Integer studentNumber;
private String name;
private Set<Enrolment> enrolments
= new HashSet<Enrolment>();
public Student()
{
}
public Student(Integer studentNumber , String name)
{
this.studentNumber = studentNumber;
this.name = name;
}
public void setStudentNumber(Integer studentNumber)
{
this.studentNumber = studentNumber;
}
public Integer getStudentNumber()
{
return this.studentNumber;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setEnrolments(Set<Enrolment> enrolments)
{
this.enrolments = enrolments;
}
public Set<Enrolment> getEnrolments()
{
return this.enrolments;
}
}
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 指定Hibernate映射文件的DTD信息 -->
<hibernate-mapping package="sun.domain">
<!-- 映射Student实体 -->
<class name="Student" table="student_inf">
<!-- 映射标识属性 -->
<id column="student_id" name="studentNumber">
<!-- 指定assigned的主键生成器策略 -->
<generator class="assigned"/>
</id>
<!-- 映射普通属性 -->
<property generated="never" lazy="false" name="name" not-null="true"/>
<!-- 映射学生和选课记录的1-N关联 -->
<set cascade="delete" inverse="true" name="enrolments" sort="unsorted">
<!-- 映射外键 -->
<key column="student_id"/>
<!-- 映射关联的Enrolment实体 -->
<one-to-many class="Enrolment"/>
</set>
</class>
</hibernate-mapping>
HibernateUtil我就不写了,可以在MyEclipse中自动生成
测试类
package sun.test;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Property;
import sun.domain.Student;
import sun.util.HibernateUtil;
public class DetachedCriteriaTest {
public static void main(String[] args) {
DetachedCriteriaTest pt = new DetachedCriteriaTest();
pt.datached();
pt.subQuery();
}
/**
* 子查询
*/
private void subQuery() {
//定义一个离线查询
DetachedCriteria subQuery = DetachedCriteria.forClass(Student.class)
.setProjection(Property.forName("name"));
Session session = HibernateUtil.getSession();
HibernateUtil.beginTransaction();
List l = session.createCriteria(Student.class)
.add(Property.forName("name").in(subQuery)).list();
for (Iterator iterator = l.iterator(); iterator.hasNext();) {
Student stu = (Student) iterator.next();
System.out.println(stu.getName());
}
HibernateUtil.commit();
HibernateUtil.closeSession();
}
/**
* 离线查询
*/
private void datached() {
DetachedCriteria query = DetachedCriteria.forClass(Student.class)
.setProjection(Property.forName("name"));
Session session = HibernateUtil.getSession();
HibernateUtil.beginTransaction();
List l = query.getExecutableCriteria(session).list();
for (Iterator iterator = l.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
HibernateUtil.commit();
HibernateUtil.closeSession();
}
}
运行结果: