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