离线查询和子查询--DetachedCriteria

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


运行结果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值