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(); }