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. yii rbac

    一.简介 什么是rbac ? rbac是就是基于角色的访问控制. yii提供一套基础的底层接口,我们知道,rbac经历好几个阶段,从rbac0到rbac3,从基础的用户.角色.权限,到动态的rbac处 ...

  2. 详解 JavaScript 中 splice() 方法

    splice() 方法是一个比较少用的方法,但是功能确实很好,并且在我们 coding 的时候,经常有需要 splice() 方法,先介绍一下该方法. 在 JavaScript 中 splice() ...

  3. Uva12230Crossing Rivers 数学

    Uva12230Crossing Rivers 问题: You live in a village but work in another village. You decided to follow ...

  4. hasattr() & getattr() & setattr()

    Python的hasattr() getattr() setattr() 函数使用方法详解   感谢作者 ---> 原文链接 hasattr(object, name) 判断一个对象里面是否有n ...

  5. JS实现禁用滑动条但滑动条不消失的效果

    //方法 //滑动条 // left: 37, up: 38, right: 39, down: 40, // spacebar: 32, pageup: 33, pagedown: 34, end: ...

  6. TouTiao开源项目 分析笔记8 图解分析数据加载方式

    1.整体构架 1.1.以一个段子页面为例,列出用到的主要的类,以图片的方式展示. 1.2.基础类 这里最基础的接口有:   IBaseView<T>==>定义了5个方法. 然后最基础 ...

  7. java练习题——字符串

    一.动手动脑之String.equals()方法: 判断s1和s2的内容相同s1.equals(s2). 判断s1和s2的地址相同s1 == s2. 二.整理String类的Length().char ...

  8. setBackgroundResource和setImageResource的区别

    setBackgroundResource是设置view的背景图片 setImageResource是设置ImageView的图片 对于一个imagevewButton来说,你既可以setBackgr ...

  9. 关于update 表名 set 字段1 = 值1 and 字段2 = 值2的执行结果说明

    技术交流群: 233513714 如果执行了以下的语句,则brand等于‘OPPO’条件所对应的数据不会做改变,但是sequence_brand列除brand = 'OPPO'之外的所有数据都会变为0 ...

  10. Java从数据库读取页面树形菜单

    从数据库加载菜单及子菜单主要使用递归的方法,具体实现可看代码 首先封装一个菜单pojo public class Menu { // 菜单id private String id; // 菜单名称 p ...