`
newleague
  • 浏览: 1475296 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

hibernate实例简析-hibernate_hql(一)

阅读更多

1、StatQueryTest

session = HibernateUtils.getSession();
   session.beginTransaction();
   
//   List students =session.createQuery("select count(*) from Student").list();
//   Long count = (Long)students.get(0);
//   System.out.println(count);

   Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
   System.out.println(count);
   
   session.getTransaction().commit();

 

 

List students =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=students.iterator(); iter.hasNext();) {
    Object[] obj = (Object[])iter.next();
    System.out.println(obj[0] + ", " + obj[1]);
   }

 

 简单属性查询【重要】
 * 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
 * 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
   数组的长度取决与select中属性的个数
 * 如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
 参见:SimplePropertyQueryTest.java

2、SimplePropertyQueryTest

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

 

 

 

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

 

 

 

List students = session.createQuery("select new Student(id, name) from Student").list();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println(student.getId() + "," + student.getName());
   }

 

 

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

 

 

List students = session.createQuery("select s.id, s.name from Student as s").list();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Object[] obj = (Object[])iter.next();
    System.out.println(obj[0] + "," + obj[1]);
   }

 

 

实体对象查询【重要】
 * N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
   所谓的N+1是在查询的时候发出了N+1条sql语句
   1: 首先发出一条查询对象id列表的sql
   N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
 * list和iterate的区别?
  * list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
  * iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
 参见:SimpleObjectQueryTest1.java/SimpleObjectQueryTest2.java

3、SimpleObjectQueryTest2

 

List students = session.createQuery("from Student").list();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println(student.getName());
   }

 

Iterator iter = session.createQuery("from Student").iterate();
   while(iter.hasNext()) {
    Student student = (Student)iter.next();
    System.out.println(student.getName());
   }

 

 

List students = session.createQuery("from Student").list();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println(student.getName());
   }
   Iterator iter = session.createQuery("from Student").iterate();
   while(iter.hasNext()) {
    Student student = (Student)iter.next();
    System.out.println(student.getName());
   }

 

 

List students = session.createQuery("from Student").list();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println(student.getName());
   }
   students = session.createQuery("from Student").list();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println(student.getName());
   }

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics