query的list()和iterate()区别 面试题

                                                              

                                                                                query的list()和iterate()区别

 

1.返回的类型不一样,list返回List,iterate返回iterator

2.查询策略不同。

获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中把id取出来,然后真正要遍历某个对象的时候先到缓存中找

,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1

 

 1 @Test
 2     public void fetchAndList(){
 3          Session session = HibernateUtil.currentSession();
 4          Transaction tx = session.beginTransaction();
 5          Query query=session.createQuery("from Emp");
 6          List<Emp> list=query.list();
 7          for (Emp emp : list) {
 8             System.out.println(emp.getEmpName());
 9             System.out.println("==========================================");
10             //fetch
11             System.out.println(emp.getDept().getDeptName());
12          }
13          
14 //         
15 //         Iterator ite = query.iterate();
16 //        
17 //         System.out.println("====================================");
18 //         while(ite.hasNext()){
19 //             System.out.println(ite.next());
20 //             
21 //         }
22 //         
23          
24          tx.commit();
25          HibernateUtil.closeSession();
26     }
27     

 

list查询结果

iterate测试结果

 

3.iterate会查询2级缓存,list只会缓存,但不会使用缓存(除非结合查询缓存)。

4.list中返回的list中每个对象都是原本的对象,iterate中返回的对象是代理对象

 

代码解析:

/**
     * list()和iterate()方法的区别
     * 
     * 区别一:查询策略不同。
     * **/
    @Test
    public void one(){
         Session session = HibernateUtil.currentSession();
         Transaction tx = session.beginTransaction();
         Query query=session.createQuery("from Emp");
         List<Emp> list=query.list();
         for (Emp emp : list) {
            System.out.println(emp.getEmpName());
            System.out.println("==========================================");
            //fetch
            System.out.println(emp.getDept().getDeptName());
         }
         
     
//         Iterator ite = query.iterate();
//        
//         System.out.println("====================================");
//         while(ite.hasNext()){
//             System.out.println(ite.next());
//             
//         }
     
         
         tx.commit();
         HibernateUtil.closeSession();
    }
    
    
    
    /**
     * 区别二:iterate会查询2级缓存,list只会缓存,但不会使用缓存(除非结合查询缓存)。
     * **/
    @Test
    public void two(){
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();
        
        /**
         * 一级缓存
         * **/
        
        /*List<Emp> list = session.createQuery("from Emp").list();
        for (Emp emp : list) {
            System.out.println(emp.getEmpName());
        }
        System.out.println("===================================");
        
        List<Emp> list2 = session.createQuery("from Emp").list();
        for (Emp emp : list2) {
            System.out.println(emp.getEmpName());
        }*/
        
        /*Iterator iterate = session.createQuery("from Emp").iterate();
        while(iterate.hasNext()){
            System.out.println(iterate.next());
        }
        System.out.println("=====================================");
        Iterator iterates = session.createQuery("from Emp").iterate();
        while(iterates.hasNext()){
            System.out.println(iterates.next());
        }*/
        
        
        
        /**
         * 二级缓存
         * **/
        
        
        
        /*List<Emp> list = session.createQuery("from Emp").list();
        for (Emp emp : list) {
            System.out.println(emp.getEmpName());
        }
        
        HibernateUtil.closeSession();
        Session session2 = HibernateUtil.currentSession();
        Transaction tx2 = session2.beginTransaction();
        System.out.println("===================================");
        
        List<Emp> list2 = session2.createQuery("from Emp").list();
        for (Emp emp : list2) {
            System.out.println(emp.getEmpName());
        }
        
        tx2.commit();*/
        
        /*
        Iterator iterate = session.createQuery("from Emp").iterate();
        while(iterate.hasNext()){
            System.out.println(iterate.next());
        }
        HibernateUtil.closeSession();
        
        System.out.println("=====================================");
        
        Session session2 = HibernateUtil.currentSession();
        Transaction tx2 = session2.beginTransaction();
        Iterator iterates = session2.createQuery("from Emp").iterate();
        while(iterates.hasNext()){
            System.out.println(iterates.next());
        }
        

        tx2.commit();*/
        
        
        
        /**
         * 查询缓存  
         * **/
        List<Dept> list =(List<Dept>) session.createQuery("from Dept").setCacheable(true).list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
        
        System.out.println("========================================");
        List<Dept> list2 =(List<Dept>) session.createQuery("from Dept").setCacheable(true).list();
        for (Dept dept : list2) {
            System.out.println(dept.getDeptName());
        }
        
        
        
        HibernateUtil.closeSession();
        
        
    }

    
    
    /**
     *区别三: list中返回的list中每个对象都是原本的对象,iterate中返回的对象是代理对象
     * */
    @Test
    public void three(){
         Session session = HibernateUtil.currentSession();
         Transaction tx = session.beginTransaction();
         Query query=session.createQuery("from Emp");
         //不存在延迟加载
//         List<Emp> list=query.list();
         
         
         //存在延迟加载
         Iterator iterate = query.iterate();
         
         tx.commit();
         HibernateUtil.closeSession();
        
    }
    
    

 

posted @ 2016-08-18 14:38  回青  阅读(3342)  评论(0编辑  收藏  举报