Hibernate学习文档_HQL

来源:互联网 发布:电子商务app软件多少钱 编辑:程序博客网 时间:2024/05/21 11:00

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>

//初始化数据@Testpublic 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.简单属性查询

@Testpublic 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中增加ConstructorList<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.可以使用别名,可以使用asList 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.条件查询

@Testpublic 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查询

@Testpublic 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文件中存在

@Testpublic 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语句

@Testpublic 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的使用,分页

@Testpublic 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.连接查询

@Testpublic 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 cList 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.统计查询

@Testpublic 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风格的查询,尽量不用,因为缓存不同步

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

@Testpublic 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);}}