Hibernate学习文档_HQL
2011-08-20 16:49
337 查看
Entity与mapping文件
1.简单属性查询
2.条件查询
3.原生Sql查询
4.外置命名查询
参见顶部的hbm.xml,配置在query标签下配置命名
需要注意的是,命名不能重复,并且可以在任意的hbm.xml文件中存在
5.Filter的使用,使用不多
注意,filter的作用域仅限于当前对象,并且命名不能含有.
过滤器中的参数,必须全部赋值,该功能并不常用,因为不能动态生成where语句
6.Filter的使用,分页
7.连接查询
8.统计查询
9.DML风格的查询,尽量不用,因为缓存不同步
需要在找到一个和缓存同步的方法
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); } }
相关文章推荐
- CowNew开源学习文档-hibernate 的HQL源码分析1
- hibernate官方文档手册学习--第 16 章 HQL: Hibernate 查询语言
- Jimoshi_Hibernate 框架学习(四)--事务隔离级别、Hibernate执行SQL、HQL语句、连接池、Hibernate二级缓存
- Hibernate框架学习(八)——查询-HQL语法
- Hibernate学习文档_one2one
- Hibernate中的三种查询HQL、Criteria、Sql学习(二)
- Hibernate的学习之路十七(HQL条件查询)
- Hibernate参考文档学习笔记——Hibernate入门(二)
- hibernate 中HQL语句查询学习
- Hibernate的学习之路三十(HQL的基本查询)、
- Hibernate的学习之路三十二(HQL的聚合函数查询)
- 【SSH】hibernate之hql学习
- Hibernate官方文档学习之重要概念
- Hibernate学习文档_Lazy
- Hibernate学习文档_继承
- Hibernate的学习之路十七(HQL条件查询)
- Hibernate学习37 -- Hibernate查询语言(HQL)11 -- DML风格的操作
- Hibernate完全学习文档(ssh框架)
- Hibernate的学习之路三十(HQL的基本查询)、
- Hibernate的学习之路三十二(HQL的聚合函数查询)