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. B1076 Wifi密码 (15分)

    B1076 Wifi密码 (15分) 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B ...

  2. mysql学习第三天练习(流程控制函数)

    -- 流程控制函数 -- 1.查询员工部门号,并赋予部门名 select empno,ename,deptno,case deptno then '10部门' then '20部门' else '30 ...

  3. P2680 运输计划(二分+树上差分)

    P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...

  4. 一个简单的同步集群的shell脚本

    编写一个xsync文件 然后放在/usr/local/bin 目录下面 xsync文件如下: #!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if((pco ...

  5. svn服务器的配置和使用

    安装好了svn服务器,打开 VisualSVN Server Manager 先新建用户和组,在代码库创建的时候可以指定哪些用户或者组有读写权限,也可以创建好后指定 创建用户 输入用户名和密码创建用户 ...

  6. Python IO关于mode参数的问题

    关于open()的mode参数: 'r':读 'w':写 'a':追加 'r+' == r+w(可读可写,文件若不存在就报错(IOError)) 'w+' == w+r(可读可写,文件若不存在就创建) ...

  7. adb启动和关闭

    启动adb服务: cmd("adb start-server"); 关闭adb服务: cmd("adb start-server");

  8. 四 Android Capabilities讲解

    本文转自:http://www.cnblogs.com/sundalian/p/5629429.html Android Capabilities讲解   1.Capabilities介绍 可以看下之 ...

  9. Java基础-8构造方法

    一).构造方法: 在之前我们提到对象的概念以及对象的实例化等,在这里简单回顾下: Man man = new Man(); 语句创建一个对象,new可以理解成创建一个对象的关键字,通过new关键字为对 ...

  10. 孤荷凌寒自学python第五十一天初次尝试使用python连接Firebase数据库

    孤荷凌寒自学python第五十一天初次尝试使用python连接Firebase数据库 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库服 ...