hibernate:list与iterator区别

来源:互联网 发布:淘宝收藏有礼怎么设置 编辑:程序博客网 时间:2024/05/21 13:22

示例演示查询list与iterate的区别

Java代码  收藏代码
  1. 1、实体对象的查询,查询的是实体对象的数据【重要】  
  2.   * n+1问题,在默认配置的情况下,使用query.iterate()操作,有可能有n+1问题,所谓  
  3.   n+1,指在查询对象数据的时候,发出了n+1条查询语句。  
  4.   1:首先发出了一条查询语句,查询对象的id列表  
  5.   n:在迭代访问每个对象的时候,如果缓存中没有对象数据,Hibernate会在此发出一条查询语句,  
  6.      查询相应的对象   
  7.     
  8.   *List操作与Iterate操作的区别  
  9.    list,每次都会发出一条查询语句,查询所有的对象  
  10.    iterate,首先发出一条查询语句,查询对象的id列表,然后根据缓存情况,决定  
  11.     是否发出更多的查询语句,来查询对象数据  

 查看下面的代码:

Java代码  收藏代码
  1. package com.bjsxt.hibernate;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.List;  
  5.   
  6. import org.hibernate.Query;  
  7. import org.hibernate.Session;  
  8.   
  9. import junit.framework.TestCase;  
  10.   
  11. /** 
  12.  * 对象查询中的list操作和iterator操作的差异 
  13.  * @author Administrator 
  14.  * 
  15.  */  
  16. public class SimpleObjectQueryTest2 extends TestCase {  
  17.       
  18.     public void testQueryWithListMethod() {  
  19.             Session session = null;  
  20.             try {  
  21.                 session = HibernateUtils.getSession();  
  22.                   
  23.                 /** 
  24.                  * 将发出一条查询语句,获取Student的集合数据 
  25.                  * select student0_.id as id1_, student0_.name as name1_,  
  26.                  * student0_.createTime as createTime1_, student0_.classid as classid1_  
  27.                  * from t_student student0_ 
  28.                  */  
  29.                 List students = session.createQuery("from Student").list();  
  30.                 for (Iterator iter = students.iterator();iter.hasNext();) {  
  31.                     Student student = (Student)iter.next();  
  32.                     System.out.println(student.getName());  
  33.                 }  
  34.             }catch(Exception e) {  
  35.                 e.printStackTrace();  
  36.             }finally {  
  37.                 HibernateUtils.closeSession(session);  
  38.             }     
  39.         }         
  40.       
  41.     public void testQueryWithIterateMethod() {  
  42.         Session session = null;  
  43.         try {  
  44.             session = HibernateUtils.getSession();  
  45.               
  46.             //先发出查询id的列表语句  
  47.             //select student0_.id as col_0_0_ from t_student student0_  
  48.             //再依次发出查询对象的sql(根据id)  
  49.             //select student0_.id as id1_0_, student0_.name as name1_0_,   
  50.             //student0_.createTime as createTime1_0_, student0_.classid as classid1_0_   
  51.             //from t_student student0_ where student0_.id=?  
  52.             Query query = session.createQuery("from Student");  
  53.             Iterator students = query.iterate();  
  54.             while (students.hasNext()) {  
  55.                 Student student = (Student)students.next();  
  56.                 System.out.println(student.getName());  
  57.             }  
  58.         }catch(Exception e) {  
  59.             e.printStackTrace();  
  60.         }finally {  
  61.             HibernateUtils.closeSession(session);  
  62.         }     
  63.     }     
  64.       
  65.     public void testQueryWithListAndIterate() {  
  66.         Session session = null;  
  67.         try {  
  68.             session = HibernateUtils.getSession();  
  69.             Query query = session.createQuery("from Student");  
  70.             List students = query.list();  
  71.             for (Iterator iter = students.iterator();iter.hasNext();) {  
  72.                 Student student = (Student)iter.next();  
  73.                 System.out.println(student.getName());  
  74.             }  
  75.               
  76.             //如果使用iterate进行查询  
  77.             //因为list操作已经将对象加载到了session的一级缓存,所以  
  78.             //再使用iterate操作的时候,它先会发出查询id列表的查询语句  
  79.             //再根据id到缓存中获取相关的数据  
  80.             //只有再缓存中找不到相关数据的情况下,才会再次发出sql进行查询  
  81.             Iterator studentsIter = query.iterate();  
  82.             while (studentsIter.hasNext()) {  
  83.                 Student student = (Student)studentsIter.next();  
  84.                 System.out.println(student.getName());  
  85.             }  
  86.         }catch(Exception e) {  
  87.             e.printStackTrace();  
  88.         }finally {  
  89.             HibernateUtils.closeSession(session);  
  90.         }     
  91.           
  92.     }  
  93.       
  94.     public void testQueryWithListAndList() {  
  95.         Session session = null;  
  96.         try {  
  97.             session = HibernateUtils.getSession();  
  98.             Query query = session.createQuery("from Student");  
  99.             List students = query.list();  
  100.             for (Iterator iter = students.iterator();iter.hasNext();) {  
  101.                 Student student = (Student)iter.next();  
  102.                 System.out.println(student.getName());  
  103.             }  
  104.               
  105.             //再次发出发出sql  
  106.             //在默认情况下,list每次都会向数据库发出查询对象数据的sql,  
  107.             //除非配置了查询缓存,所以下面的list()操作,虽然在session已经有了  
  108.             //对象缓存数据,但list()并不理会这个中缓存,而再次发出查询语句进行查询  
  109.             students = query.list();  
  110.             for (Iterator iter = students.iterator();iter.hasNext();) {  
  111.                 Student student = (Student)iter.next();  
  112.                 System.out.println(student.getName());  
  113.             }  
  114.         }catch(Exception e) {  
  115.             e.printStackTrace();  
  116.         }finally {  
  117.             HibernateUtils.closeSession(session);  
  118.         }     
  119.     }  
  120.       
  121.       
  122. }  

 

 

详细查看注释部分代码.

以后对查询的性能优化..

原创粉丝点击