query的list()和iterate()区别 面试题

                                                              

                                                                                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<Emp> list=query.list();
 7          for (Emp emp : list) {
 8             System.out.println(emp.getEmpName());
 9             System.out.println("==========================================");
10             //fetch
11             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()方法的区别* * 区别一:查询策略不同。* **/@Testpublic 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只会缓存,但不会使用缓存(除非结合查询缓存)。* **/@Testpublic 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中返回的对象是代理对象* */@Testpublic 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();}

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis windows学习(二)——Redis持久化的AOF模式和RDB模式

AOF和RDB是什么 Redis进行操作时&#xff0c;有两种方式将操作的结果保存下来。一种是将结果以快照的方式保存在二进制文件中&#xff08;默认叫&#xff1a;dump.rdb* &#xff09;&#xff0c;这就是RDB模式&#xff0c;另一种是将操作的命令追加到一个记录文件里&#xff0…

java+eclipse+selenium环境搭建

这几天在学selenium&#xff0c;大头虾的我。安装环境还是遇到了挺多问题&#xff0c;赶紧来记录下。不然下次又。。。&#xff08;参考虫师的《Selenium2 Java自动化测试实战》&#xff09;&#xff0c;就随便写写加深下自己的印象。 1、安装java 访问java官网下载jdk http://…

unity socket传输图片_python3实现socket传输图片

我最近在做一个项目的时候需要把树莓派上的摄像头拍摄的图片实时传输到我的PC上我想通过socket完成这个功能我找了找网上的代码&#xff0c;好多都是python2.x版本的&#xff0c;或者是图片总是传不过来的&#xff0c;只能自己写了一个我先附上我的源代码&#xff0c;再来聊一聊…

Spring AOP编程问题:下面代码哪里错了?可以考验对Spring AOP的实现机制是否了解的

引言 刚刚开始学Spring AOP&#xff0c;按照教程配置好之后&#xff0c;可以像正常方法那样执行&#xff0c;却怎么也不会执行切面的方法。去群里问了一下&#xff0c;结果也没有解决。然后自己慢慢的试&#xff0c;终于发现了原因。 下面是一段有问题的代码&#xff0c;只有…

System.Web.HttpContext.Current.Session为NULL解决方法

http://www.cnblogs.com/tianguook/archive/2010/09/27/1836988.html 自定义 HTTP 处理程序&#xff0c;从IHttpHandler继承&#xff0c;在写System.Web.HttpContext.Current.Session["Value"]的时 候&#xff0c;没有问题&#xff0c;但想将这个Session写到某个变量…

python 对象_Python中的Barrier对象

python中的Barrier对象用于等待固定数量的线程完成执行&#xff0c;然后任何特定线程才能继续执行程序。每个线程在到达Barrier时都调用wait()函数。Barrier负责跟踪wait()调用的数量。如果该数目超出了为其初始化Barrier的线程数&#xff0c;则Barrier为等待线程提供了一种继续…

Spring AOP原理浅析及入门实例

上篇问题及Spring AOP实现原理浅析 上篇说了一个AOP编程问题&#xff0c;那是一个错误的AOP案例。它的错误在A类中&#xff0c;再次粘贴A类代码&#xff1a; Componentpublic class AImpl implements A{public void doing() {System.out.println("hello");}public s…

AE CreateFeatureClass 创建shp. 删除shp. 向shp中添加要素

/// <summary>/// 创建多边形shp/// </summary>/// <param name"pPolygon"></param>/// <param name"shpPath"></param>public static void CreatePolygonFeatureClass(IPolygon pPolygon, string shpfolder,string …

aes密文长度_RSA加密密文可变(一句话说明)

先来看一个搜索结果&#xff1a;RSA算法本质上是基于数学【对极大整数做因数分解的难度】的原理&#xff0c;so 密文本质上是一堆有规则的数字经过编码和【填充】的结果。原文和加密密钥相同&#xff0c;在java环境&#xff0c;默认Padding模式下每次生成的密文是相同的&#x…

网络分析之networkx(转载)

图的类型 Graph类是无向图的基类&#xff0c;无向图能有自己的属性或参数&#xff0c;不包含重边&#xff0c;允许有回路&#xff0c;节点可以是任何hash的python对象&#xff0c;节点和边可以保存key/value属性对。该类的构造函数为Graph(dataNone&#xff0c;**attr)&#xf…

ubuntu 14 java web服务器搭建

前言 前段时间&#xff0c;在阿里云买了台云服务器&#xff0c;30多块&#xff0c;然后部署了一个tomcatmysqlredissvn的运行环境&#xff0c;下面是一些整理。 连接到远程服务器 使用ssh登陆工具&#xff0c;比如scure CRT&#xff0c;以下的命令都是指在scure CRT下输入 …

sqlite管理工具_Liquibase 数据库版本管理工具:1.安装

1.Liquibase 是什么粘一段官方的解释Track, version, and deploy database changes跟踪、管理和应用数据库变化说白了&#xff0c;就是一个将你的数据库脚本转化为xml格式保存起来。其中包含了你对数据库的改变&#xff0c;以及数据库的版本信息&#xff0c;方便数据的升级和回…

BZOJ2720: [Violet 5]列队春游

2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 173 Solved: 125[Submit][Status][Discuss]Description Input Output Sample Input Sample Output HINT 题解&#xff1a;对于这种题目我只能呵呵一笑欺负我是单身汪&#xff0c;哎&#xff01; 一、…

win7下卸载linux系统(不用windows光盘)

前言 安装win7Linux双系统后&#xff0c;不想用了&#xff0c;该怎么卸载呢&#xff1f;其实&#xff0c;只要删除Linux分区即可删除掉Linux&#xff0c;但是&#xff0c;为了防止启动进不了windows&#xff0c;还是要更新一下主引导记录。 步骤一&#xff1a;使用MbrFix工具…

python 文本处理库_推荐8种目前Python使用率最高的文本处理工具

前言 文本处理一般包括词性标注&#xff0c;句法分析&#xff0c;关键词提取&#xff0c;文本分类&#xff0c;情感分析等等&#xff0c;这是针对中 文的&#xff0c;如果是对于英文来说&#xff0c;只需要基本的tokenize。本文为大家提供了以下这些工具包。我整理了Python的相…

面向对象(二)——三大特性(封装、继承、多态)

一、封装 目的&#xff1a;保护类&#xff0c;让类更加安全。 做法&#xff1a;让类里面的成员变量变为私有&#xff08;即访问修饰符&#xff09;的&#xff0c;做相应的方法或者属性去间接的操作成员变量 ※访问修饰符 private 私有的 只能在该类中访问 protec…

利用伸展树提高区间操作的性能

一、首先&#xff0c;什么是区间操作&#xff1f;以及各种数据结构性能对比 区间操作就是对一个序列的某个区间的所有元素进行的操作。比如&#xff0c;对区间所有元素增加一个值&#xff0c;翻转区间元素等。 对区间操作&#xff0c;最普通的方法就是数组。比如&#xff1a;…

python书写风格_以下两种风格 Python 写法,请问大家倾向哪种:)

看到不同的同事代码&#xff0c;表达同一个意思&#xff0c;主要 if 部分以下哪种写法比较好些&#xff1a;&#xff09; 第一种写法 def xxxx(ph, sin_id): """ """ with OracleConnect(xxxx) as db_oracle: sql u"xxxxx" has_data,…

中科大开源镜像使用帮助列表

https://lug.ustc.edu.cn/wiki/mirrors/help转载于:https://www.cnblogs.com/hikecn/p/5797959.html

伸展树的代码实现

一、伸展树的数据结构 typedef struct Node {int key; struct Node *lch,*rch,*parent; }* Node ,* Tree; 二、伸展树的基础操作 下面几个函数中&#xff0c;设x 的父节点为 p, p的父节点为g 。 zig( t , x ) 右旋。当p是根节点&#xff0c;x是p的左孩子&#xff0c;将…