博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
query的list()和iterate()区别 面试题
阅读量:5126 次
发布时间:2019-06-13

本文共 5368 字,大约阅读时间需要 17 分钟。

                                                              

                                                                                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
list=query.list(); 7 for (Emp emp : list) { 8 System.out.println(emp.getEmpName()); 9 System.out.println("==========================================");10 //fetch11 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
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
list = session.createQuery("from Emp").list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } System.out.println("==================================="); List
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
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
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
list =(List
) session.createQuery("from Dept").setCacheable(true).list(); for (Dept dept : list) { System.out.println(dept.getDeptName()); } System.out.println("========================================"); List
list2 =(List
) 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
list=query.list(); //存在延迟加载 Iterator iterate = query.iterate(); tx.commit(); HibernateUtil.closeSession(); }

 

转载于:https://www.cnblogs.com/hmy-1365/p/5783838.html

你可能感兴趣的文章
前端小问题4
查看>>
mysql timeout
查看>>
结构体的赋值和初始化与取出结构体变量中的成员
查看>>
Shared_from_this 几个值得注意的地方
查看>>
在ASP.NET MVC中实现Select多选
查看>>
制作曲线图
查看>>
Codeforces Round #177 (Div. 1) B. Polo the Penguin and Houses【组合数学】
查看>>
ccf--20140903--字符串匹配
查看>>
CF468B Two Sets
查看>>
c# winform窗体如何设置才可以不能随意拖动大小
查看>>
Cmd Markdown 简明语法手册
查看>>
使用mybatis操作AS400数据库
查看>>
Swift 操作符
查看>>
silverlight制作虚线的边框
查看>>
prometheus 笔记
查看>>
electron知识点
查看>>
字符串json转换为xml xml转换json
查看>>
C#多线程编程
查看>>
投资股权众筹项目,至少需要关注6个方面
查看>>
网站开发和企业级开发有什么区别?
查看>>