query的list()和iterate()区别

1.返回的类型不一样,list返回List,iterate返回iterator

2.查询策略不同。

获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中把id取出来,然后真正要遍历某个对象的时候先到缓存中找

,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1

 @Test
public void fetchAndList(){
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();
}

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

query的list()和iterate()区别 面试题的更多相关文章

  1. query 的list()和iterator()区别

    区别: 1.返回的类型不一样,list返回List,iterate返回iterator. 2.查询策略不同.(获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中获取id,然后 ...

  2. Hibernate中HQL语句中list与iterate区别

    session.createQuery("from Classes").list() session.createQuery("from Classes").i ...

  3. hibernate中Query的list和iterator区别(续)

    打开cache后query的list和iterator方法区别 将query 的cache打开的话,缓存的是query本身,以hql 生成的 sql ,再加上参数,分页等信息做为key值,而不是que ...

  4. mybatis 中#{}与${}的区别 (面试题)

    MyBatis/Ibatis中#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号. 如:order by #user_id#,如果传入的值是111,那么解析成sql时的 ...

  5. hibernate中Query的list和iterator区别

    1.Test_query_list类 public class Test_query_iterator_list { public static void main(String[] args) { ...

  6. 【转】elasticsearch的查询器query与过滤器filter的区别

    很多刚学elasticsearch的人对于查询方面很是苦恼,说实话es的查询语法真心不简单-  当然你如果入门之后,会发现elasticsearch的rest api设计是多么有意思. 说正题,ela ...

  7. ng-if ng-show ng-hide区别(面试题)

    ng-if ng-show  ng-hide区别 实现原理方面: ng-show/ng-hide是通过修改css样式方式控制元素显示与隐藏,对应的DOM元素会一直存在于当前页面中: 而ng-if根据表 ...

  8. rgba()和opacity之间的区别(面试题)

    rgba()和opacity之间的区别: 相同点:rgba()和opacity都能实现透明效果: 不同点:opacity作用于元素,以及元素中所有的内容: rgba()只用于于元素的颜色,及背景色: ...

  9. vue 路由传参 params 与 query两种方式的区别

    初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  router文件下index.js里面,是这么定义路由的: { p ...

随机推荐

  1. Sublime package control错误:There are no packages available for installation

    查了很多资料都没有解决. 改host---无效 复制一个文件的什么的,我看到版本比我的旧,就没有用 终于最后一个解决了.最终解决方案 解决: 更新下Package Control就好了: prefer ...

  2. strak组件(3):URL别名的优化

    将生成URL别名的功能进行解耦.效果和上一节的一样. 效果图: 新增函数 get_url_name(self, param) # 生成url别名,需要一个参数(list/add/edit/delete ...

  3. hive原理

    什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. Hive架构图 Jobtracker是hadoop1.x中的组件,它的 ...

  4. Python数据类型一

    一.整型 在Python内部对整数的处理分为普通整数和长整数,普通整数长度为机器位长,通常都是32位,超过这个范围的整数就自动当长整数处理,而长整数的范围几乎完全没限制Python可以处理任意大小的整 ...

  5. unity3d中C#与JS的一些区别

    unity3d目前支持C#和JS两种脚本语言. 学习过程中发现很多教程使用的是JS语言,自己还是用C#比较多,unity原生使用的是Mono,使用C#会更加接近unity的编程思想. 1.方法的定义, ...

  6. Java SE 5.0 - SE 8 的功能增强

    Table of Contents 前言 Java 5.0 Generics Enhanced for Loop Autoboxing Typesafe Enums Varargs Static Im ...

  7. Java基础-3类和对象声明与创建

    一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...

  8. Canvas 图形组合方式

    /** * 图形组合 */ function initDemo5() { var canvas = document.getElementById("demo5"); if (!c ...

  9. 课时34:丰富的else语句以及简洁的with语句

    目录: 一.丰富的else语句 二.简洁的with语句 三.课时34课后习题及答案 *********************** 一.丰富的else语句 ********************** ...

  10. go语言的学习网站

    1)http://www.runoob.com/go/go-data-types.html 2)https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/ ...