Hibernate学习文档_HQL

Entity与mapping文件


public class Student {

	private int id;
	private String name;
	private Date createTime;
	private Classes classes;

	public Student() {
	}

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}
}


public class Classes {

	private int id;
	private String name;
	private Set<Student> students;
	
	public Classes(){
		
	}
}


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.lohamce.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<property name="createTime" />
		<many-to-one name="classes" column="classesid" />
		<filter name="filter" condition="id < :myid" />
	</class>

	<query name="Student.searchStudents">
		<![CDATA[
			SELECT s FROM Student s where s.id<?
		]]>
	</query>

	<filter-def name="filter">
		<filter-param name="myid" type="integer" />
	</filter-def>
</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lohamce.hibernate">
	<class name="Classes" table="t_classes">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<set name="students" inverse="true" cascade="all">
			<key column="classesid" />
			<one-to-many class="Student" />
		</set>
	</class>
</hibernate-mapping>

//初始化数据
	@Test
	public void initStudents(){
		Session session = HibernateUtil.openSession();

		try {
			session.beginTransaction();

			for(int i=0; i<10; i++){
			
				Classes classes = new Classes();
				classes.setName("班级"+i);
				session.save(classes);
				
				for(int j=0; j<10; j++){
					Student student = new Student();
					student.setName("班级"+i+"的学生"+j);
					student.setCreateTime(randomDate("2008-01-01","2008-03-01"));
					
					//在内存中建立由student指向classes的引用
					student.setClasses(classes);
					session.save(student);
				}
			}
			
			for(int i=0; i<5; i++){
				Classes classes = new Classes();
				classes.setName("无学生班级"+i);
				session.save(classes);
			}
			
			for(int i=0; i<10; i++){
				Student student = new Student();
				student.setName("无业游民"+i);
				session.save(student);
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally{
			HibernateUtil.close(session);
		}
	}
	
	
	/**
	 * 获取随机日期
	 * @param beginDate 起始日期,格式为:yyyy-MM-dd
	 * @param endDate 结束日期,格式为:yyyy-MM-dd
	 * @return
	 */
	private static Date randomDate(String beginDate,String endDate){
		try {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			Date start = format.parse(beginDate);
			Date end = format.parse(endDate);
			
			if(start.getTime() >= end.getTime()){
				return null;
			}
			
			long date = random(start.getTime(),end.getTime());
			
			return new Date(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private static long random(long begin,long end){
		long rtn = begin + (long)(Math.random() * (end - begin));
		if(rtn == begin || rtn == end){
			return random(begin,end);
		}
		return rtn;
	}


1.简单属性查询

	@Test
	public void testQuery1() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();

			//1.返回结果集属性列表,元素类型和实体类中相应的属性类型一致
			List students = session.createQuery("select name from Student").list();
			for (Iterator iter = students.iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				System.out.println(name);
			}
			
			
			/*// 2.查询多个属性,其集合元素是对象数组
			// 数组元素的类型和对应的属性在实体类中的类型一致
			// 数组的长度取决与select中属性的个数
			List students = session.createQuery("select id, name from Student")
					.list();
			for (Iterator iter = students.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
				System.out.println(obj[0] + "," + obj[1]);
			}*/
			
			/*// 3.如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
			// 此时list中为Student对象集合,需要在domain中增加Constructor
			List<Student> students = (List<Student>)session.createQuery("select new Student(id, name) from Student").list();
			for (Iterator<Student> iter = students.iterator(); iter.hasNext();) {
				Student student = iter.next();
				System.out.println(student.getId() + "," + student.getName());
			}*/
			
			
			/*// 4.可以使用别名,可以使用as
			List students = session.createQuery("select s.id, s.name from Student s").list();
			for (Iterator iter = students.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
				System.out.println(obj[0] + "," + obj[1]);
			}*/
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}

2.条件查询

	@Test
	public void testQuery4(){
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

			// 1. 参数
			/*List students = session.createQuery("from Student where name like ? ")
							.setParameter(0, "%"+"1"+"%")
							.list();*/
			
			// 2.参数名称
			List students = session.createQuery("from Student where name like :myname and classes.name like '%5%'")
							.setParameter("myname", "%"+"1"+"%")
							.list();
			
			// 3. 参数数组
			/*List students = session.createQuery("from Student where classes.id in (:classIds)")
							.setParameterList("classIds", new Integer[]{1,2,3})
							.list();*/
			
			// 4. 使用数据库函数,不推荐使用,移植性不好
			/*List students = session.createQuery("from Student where date_format(createTime,'%Y-%m') = ?")
							.setParameter(0, "2008-02")
							.list();*/
			
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName() +"	"+ student.getCreateTime());
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}


3.原生Sql查询

	@Test
	public void testQuery5(){
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			
			// 返回的是对象数组
			List students = session.createSQLQuery("select id, name from t_student")
							.list();
			
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Object[] obj = (Object[])iter.next();
				System.out.println(obj[0] +"	"+ obj[1]);
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}


4.外置命名查询

参见顶部的hbm.xml,配置在query标签下配置命名

需要注意的是,命名不能重复,并且可以在任意的hbm.xml文件中存在

	@Test
	public void testQuery6(){
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			
			// 返回的是对象数组
			List students = (List) session.getNamedQuery("Student.searchStudents")
							.setParameter(0, 10)
							.list();
			
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName() +"	"+ student.getCreateTime());
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}


5.Filter的使用,使用不多

注意,filter的作用域仅限于当前对象,并且命名不能含有.

过滤器中的参数,必须全部赋值,该功能并不常用,因为不能动态生成where语句

	@Test
	public void testQueryFilter(){
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			session.enableFilter("filter").setParameter("myid", 10);	
	
			List students = session.createQuery("from Student").list();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}


6.Filter的使用,分页

	@Test
	public void testQueryPaging(){
		
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			session.enableFilter("filter").setParameter("myid", 10);	
	
			List students = session.createQuery("from Student")
						.setFirstResult(1)
						.setMaxResults(2)
						.list();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
		
	}


7.连接查询

	@Test
	public void testQueryJoin(){
		
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			session.enableFilter("filter").setParameter("myid", 10);	
	
			// 此处是内连接, hql 相等于 select c, s from Student s inner join s.classes c
			List students = session.createQuery("select c, s from Classes c join c.students s")
						.list();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Object[] obj = (Object[])iter.next();
				System.out.println(((Classes)obj[0]).getName() + "	" + ((Student)obj[1]).getName());
			}
			
			// 左连接:左边的表都显示出来select c, s from Classes c left join c.students s
			// 右连接:右边的表都列出来select c.name, s.name from Classes c right join c.students s
			/*List students = session.createQuery("select c.name, s.name from Classes c right join c.students s")
							.list();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Object[] obj = (Object[])iter.next();
				System.out.println(obj[0] + "	" + obj[1]);
			}*/
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
		
	}


8.统计查询

	@Test
	public void testQueryStatistics(){
		
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			/*List students = session.createQuery("select count(*) from Student")
						.list();
			Long count = (Long)students.get(0);
			System.out.println("Students.cound = "+count);*/
			
			//如果返回值是单一值,可以调用uniqueResult()
			/*Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
			System.out.println("Students.cound = "+count);*/
			
			
			List statistics = session.createQuery("select c.name, count(s) from Student s join s.classes c" +
					" group by c.name order by c.name").list();
			for (Iterator iter = statistics.iterator(); iter.hasNext();) {
				Object[] obj = (Object[])iter.next();
				System.out.println(obj[0] + "	" + obj[1]);
			}
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
		
	}



9.DML风格的查询,尽量不用,因为缓存不同步

需要在找到一个和缓存同步的方法

	@Test
	public void testQueryDml(){
		
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			
			
			session.createQuery("update Student s set s.name=? where s.id < ?")
					.setParameter(0, "Scott")
					.setParameter(1, 5)
					.executeUpdate();
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
		
	}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值