日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

query的list()和iterate()区别 面试题

發(fā)布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 query的list()和iterate()区别 面试题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??????????????????????????????????????????????????????????????

??????????????????????????????????????????????????????????????????????????????? query的list()和iterate()區(qū)別

?

1.返回的類型不一樣,list返回List,iterate返回iterator

2.查詢策略不同。

獲取數(shù)據(jù)的方式不一樣,list會直接查詢數(shù)據(jù)庫,iterate會先到數(shù)據(jù)庫中把id取出來,然后真正要遍歷某個對象的時候先到緩存中找

,如果找不到,以id為條件再發(fā)一條sql到數(shù)據(jù)庫,這樣如果緩存中沒有數(shù)據(jù),則查詢數(shù)據(jù)庫的次數(shù)為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()方法的區(qū)別* * 區(qū)別一:查詢策略不同。* **/@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();}/*** 區(qū)別二: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();}/***區(qū)別三: 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()区别 面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。