hibernate 查询list 和iterate 区别。

 

测试代码如下:


@Test

public void TestNaddOne(){

   try{
          Session session=HibernateUtil.getSession();
         List<Engine> engline_list=session.createQuery(" from Engine").list();        
         for(int i=0;i<engline_list.size();i++){
        System.out.println(engline_list.get(i).getEnginename());
         }
          }catch(Exception e){
         e.printStackTrace(); 
          }
   try{
        Session session=HibernateUtil.getSession();
         Iterator<Engine> engline_list=session.createQuery(" from Engine").iterate();        
         while(engline_list.hasNext()){
         Engine engine=engline_list.next();
         System.out.println(engine.getEnginename());
         }
         }catch(Exception e){
         e.printStackTrace(); 
         }

}





 输出内容如下:


2015-9-9 15:13:47 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select engine0_.engineid as engineid1_1_, engine0_.carid as carid3_1_, engine0_.enginename as enginena2_1_ from engine engine0_
bmw
test_bmw7
test_bmw8
test_bmw9
Hibernate: select engine0_.engineid as col_0_0_ from engine engine0_
Hibernate: select engine0_.engineid as engineid1_1_0_, engine0_.carid as carid3_1_0_, engine0_.enginename as enginena2_1_0_ from engine engine0_ where engine0_.engineid=?
bmw
Hibernate: select engine0_.engineid as engineid1_1_0_, engine0_.carid as carid3_1_0_, engine0_.enginename as enginena2_1_0_ from engine engine0_ where engine0_.engineid=?
test_bmw7
Hibernate: select engine0_.engineid as engineid1_1_0_, engine0_.carid as carid3_1_0_, engine0_.enginename as enginena2_1_0_ from engine engine0_ where engine0_.engineid=?
test_bmw8
Hibernate: select engine0_.engineid as engineid1_1_0_, engine0_.carid as carid3_1_0_, engine0_.enginename as enginena2_1_0_ from engine engine0_ where engine0_.engineid=?
test_bmw9



由输出结果可见: 


 list 方式  通过一条select sql  实现查询操作。

 iterate 执行了5条select sql 读取对应的记录,这是典型的n+1 。数据量大的时候无疑性能比较低。既然如此为什么还要提供iterate呢? 这个问题与hibernate缓存机制密切相关 接下来看一下另一个测试


测试代码如下:


@Test
public void TestIterateCache(){
try{
 
          Session session=HibernateUtil.getSession();
         List<Engine> engline_list=session.createQuery(" from Engine").list();        
         for(int i=0;i<engline_list.size();i++){
        System.out.println(engline_list.get(i).getEnginename());
         }
         
         
         Iterator<Engine> engline_list2=session.createQuery(" from Engine").iterate();        
         while(engline_list2.hasNext()){
         Engine engine=engline_list2.next();
         System.out.println(engine.getEnginename());
         }
          
         
          }catch(Exception e){
         e.printStackTrace(); 
          }
}



输出结果如下:

2015-9-9 15:43:04 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select engine0_.engineid as engineid1_1_, engine0_.carid as carid3_1_, engine0_.enginename as enginena2_1_ from engine engine0_
bmw
test_bmw7
test_bmw8
test_bmw9
Hibernate: select engine0_.engineid as col_0_0_ from engine engine0_
bmw
test_bmw7
test_bmw8
test_bmw9




由输出结果可见: list方法执行select sql 从数据库获取记录,并构造实体对象,实体对象构建完毕之后将其纳入缓存。这样,iterate方法执行时它首先执行 一个select sql以获得所有数据的id,随即,iterate 首先在本地缓存中根据id查找对应的实体对象是否存在。如果缓存中已经存在对应的数据,则直接以此数据对象作为查询结果。如果没找到,再执行相应的select语句获得对应的库表记录。



在做一个测试list 查询是否缓存??:


测试代码如下:

@Test
public void TestListCache(){
try{
 
          Session session=HibernateUtil.getSession();
         List<Engine> engline_list=session.createQuery(" from Engine").list();        
         for(int i=0;i<engline_list.size();i++){
        System.out.println(engline_list.get(i).getEnginename());
         }
         
         
         List<Engine> engline_list2=session.createQuery(" from Engine").list();        
         for(int i=0;i<engline_list2.size();i++){
        System.out.println(engline_list2.get(i).getEnginename());
         }
          
         
          }catch(Exception e){
         e.printStackTrace(); 
          }
}



输出内容如下:


2015-9-9 16:11:45 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select engine0_.engineid as engineid1_1_, engine0_.carid as carid3_1_, engine0_.enginename as enginena2_1_ from engine engine0_
bmw
test_bmw7
test_bmw8
test_bmw9
Hibernate: select engine0_.engineid as engineid1_1_, engine0_.carid as carid3_1_, engine0_.enginename as enginena2_1_ from engine engine0_
bmw
test_bmw7
test_bmw8
test_bmw9



由输出结果可见: list 没有利用缓存中的数据。这是为什么呢? (以免新增了数据) 为了保证查询结果的完整性。list查询还是执行了一次select sql查询。iterate方法通过首先获取符合结果的数据的id,以此保证了数据的完整性。

因此,list方法实际上无法利用缓存。他对缓存只写不读。而iterate方法则可以充分发挥缓存带来的好处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值