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()方法的区别* * 区别一:查询策略不同。* **/@Testpublic 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只会缓存,但不会使用缓存(除非结合查询缓存)。* **/@Testpublic 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中返回的对象是代理对象* */@Testpublic 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();}