• 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();
            
        }
        
        
  • 相关阅读:
    数据结构开发(23):二叉树中结点的查找、插入、删除与清除操作
    数据结构开发(22):二叉树的转换、深层特性与存储结构设计
    数据结构开发(21):树中属性操作与层次遍历
    数据结构开发(20):树中结点的查找、插入、清除与删除操作
    数据结构开发(19):树的定义、操作、存储结构与实现
    数据结构开发(18):归并排序和快速排序
    数据结构开发(17):冒泡排序和希尔排序
    HTTP协议的内容协商
    长轮询实现消息推送
    XHR的应用场景
  • 原文地址:https://www.cnblogs.com/hmy-1365/p/5783838.html
Copyright © 2020-2023  润新知