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. 裸机——RTC

    1. 首先晓得RTC的基本知识 RTC被划分到timer,但RTC是面向时间点的. 如果按照定时器的思路去思考,那么应该考虑 时间周期 和 计数值. RTC 不是面向时间点的,所以略有不同, 时间周期 ...

  2. 10.2 ajax

    Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互 ...

  3. Codeforces 771E Bear and Rectangle Strips DP

    题意: 一个由大写字母组成的长度为\(n(n \leq 75)\)的字符串,每次操作可以交换相邻位置的两个字母,求最少操作多少次使字符串中不出现子串VK 分析: VK之外的字母具体是什么,我们并不关心 ...

  4. 世界未解之谜之----------Android Gradle

    今天运行项目,运行的debug出来的包竟然是命名过的,但是我的buildTypes里面的debug 并没有执行重命名操作.很奇怪,我的猜测是: 执行buildTypes的时候,虽然是assermdeb ...

  5. Java基本数据类型总结二

    Java 基本数据类型总结二 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过 ...

  6. VS Extension+NVelocity系列(三)——让VS支持 NVelocity的智能提示(中)

    一.定义 我们知道,我们的插件是服务于NVelocity的,在你的项目当中,对于NVelocity的模板应当有一个统一的文件扩展名,以便于VS在打开指定扩展名的文件后,就能起到具体的作用. 如果我没有 ...

  7. vim基本配置备份

    我的vim基本配置如下,在这里作个备份: set background=light syntax on set number set smartindent set expandtab set tab ...

  8. cookie不能删除

    cookie不仅仅包含一个键值对,还包含域 domain  路径path, 一般domain是请求的地址 www.baidu.com/news.html 那domain就是www.baidu.com ...

  9. Robot Framwork +Selenium2环境搭建

    Robot Framwork +Selenium2环境搭建 安装python 参考文章http://blog.csdn.net/sealion111/article/details/78690686 ...

  10. postman导出excel出现response

    https://jingyan.baidu.com/article/915fc414559b4351394b2084.html