query的list()和iterate()區別 面試題

                                                              

                                                                                query的list()和iterate()區別 sql

 

1.返回的類型不同,list返回List,iterate返回iterator數據庫

2.查詢策略不一樣。緩存

獲取數據的方式不同,list會直接查詢數據庫,iterate會先到數據庫中把id取出來,而後真正要遍歷某個對象的時候先到緩存中找session

,若是找不到,以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查詢結果fetch

iterate測試結果spa

 

3.iterate會查詢2級緩存,list只會緩存,但不會使用緩存(除非結合查詢緩存)。3d

4.list中返回的list中每一個對象都是本來的對象,iterate中返回的對象是代理對象代理

 

代碼解析:code

/**
     * 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();
        
    }
    
    
相關文章
相關標籤/搜索