query的list()和iterate()区别 面试题
生活随笔
收集整理的這篇文章主要介紹了
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()方法的區別* * 區別一:查詢策略不同。* **/@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();}?
轉載于:https://www.cnblogs.com/hmy-1365/p/5783838.html
總結
以上是生活随笔為你收集整理的query的list()和iterate()区别 面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue中使用阿里矢量库彩色图标办法
- 下一篇: Linux下c开发 之 线程通信与pth