Hibernate查询之list/iterator

在Hibernate3中将Session.find(),Session.iterator()换成:session.createQuery().list(),session.creqteQuery().iterator(),(实现机制并没有什么区别);

两者都是根据指定条件查询并返回符合查询的条件的实体对象;

看下session.createQuery().list():

		List<TUser> users = session.createQuery(hql).list();
		int len = users.size();
		for (int i = 0; i < len; i++) {
			TUser user = users.get(i);
			System.out.println("User name:"+user.getName());
		}

在控制台上只会输出:

Hibernate: select   tuser0_.userid as userid0_, tuser0_.name as name0_,tuser0_.age as age0_, tuser0_.info as info0_  from t_user tuser0_  where   tuser0_.age>316  

显示的结果为:

User name:keith 299

 

在看下session.createQuery().iterate():

		Iterator it = session.createQuery(hql).iterate();
		while (it.hasNext()) {
			TUser users = (TUser) it.next();
			System.out.println("user Name:"+users.getName());
		}

 看下控制台上的输出:

Hibernate: select   tuser0_.userid as col_0_0_  from  t_user tuser0_ where   tuser0_.age>316
Hibernate: select   tuser0_.userid as userid0_0_,tuser0_.name as name0_0_, tuser0_.age as age0_0_,tuser0_.info as info0_0_   from    t_user tuser0_  where   tuser0_.userid=?

 所显示的结果为:

user Name:keith 299

 

两者相比较,list()只发一条语句将符合条件的数据全部查出,而iterator()却现将id查出来,然后根据id再将符合条件的数据查出,这就构成了N+1的问题;既然list更高效,为什么hibernate还将iterator存在呢?

 

这个问题与Hibernate缓存机制密切相关,我们将两种方法写在一起:

		List<TUser> users = session.createQuery(hql).list();
		int len = users.size();
		for (int i = 0; i < len; i++) {
			TUser user = users.get(i);
			System.out.println("user Name:"+user.getName());
		}
		
		System.out.println("\n query by list is Over,and query by iterator is start...");
		
		Iterator it = session.createQuery(hql).iterate();
		
		while (it.hasNext()) {
			TUser user = (TUser) it.next();
			System.out.println("users name:"+user.getName());
		}

 看下控制台的输出:

Hibernate: select  tuser0_.userid as userid0_,tuser0_.name as name0_,tuser0_.age as age0_,tuser0_.info as info0_   from   t_user tuser0_   where   tuser0_.age>316

user Name:keith 299

 query by list is Over,and query by iterator is start...

Hibernate: select  tuser0_.userid as col_0_0_  from  t_user tuser0_ where  tuser0_.age>316

users name:keith 299

 只是将之前的list()和iterator()放在一起使用,这时的iterator只执行了一条SQL;其中的差异在于hibernate的缓存机制;

list()方法将执行Select SQL从数据库中获取所有符合满足条件的记录并构造相应的实体对象,实体对象构建完毕后,就将其纳入缓存;

这样等到iterator()执行时,首先会执行一条SQL来查询符合条件数据的id,随即,iterator方法首先在本地缓存内根据id查找对应的实体对象是否存在,如果缓存中已经存在对应的数据,则直接以此数据对象作为查询结果;如果没有找到,则再次执行Select语句获得对应数据库中的表记录(如果iterator在数据库中查到并构建了完整的数据对象,也会将其纳入缓存中);

在上面这个实例中,list()将读取的数据放入缓存中,iterator()直接可以用于是出现了以上的结果;

 

当我们再次执行上面的程序,发现结果还是一样的;list()并没有去读取它自己放进缓存的数据,因为当我们list()查询完后,即使缓存中有一些符合条件的数据,但是我们也无法保证这些数据就是合法的,如果更改下条件,将大于316改成300;那么缓存中的数据只满足大于316不会满足大于300;所有list()方法还是需要执行一次Select SQL来保证结果的完整性;得出结论:list()实际上无法利用缓存,它对缓存只写不读,而iterator()可以充分利用缓存,如果目标数据只读或者读取相当频繁,可以使用iterator()来减少性能上的消耗;

 

但是会出现这样一个问题,如果是海量数据怎么办?如果超过10万条记录的话,会有很大的可能出发OutOfMemoryError;导致系统异常;那么就用iterator()和evict()来解决吧!将内存消耗保持在可以接受的范围内;比如:

		Iterator it = session.createQuery(hql).iterate();
		while (it.hasNext()) {
			TUser users = (TUser) it.next();
			//在一级缓存中清理
			session.evict(users);
			//在二级缓存中清理,二级缓存可以设定
			SessionFactory.evict(TUser.class, users.getUserid());
			System.out.println("user Name:"+users.getName());
		}

 但是这样的话,由于JVM的异步内存回收机制,无效对象会不断的在内存中积累等待回收,如果数据量很大,必然会频繁的激发JVM的内存回收机制,导致系统性能急剧下降。因此对于这样的问题,最好使用SQL或者存储过程!

.NET 4.0下HttpWebRequest请求HTTPS报错?试试这个注册表修改方案 本文深入解析.NET 4.0下HttpWebRequest请求HTTPS报错问题,提供注册表修改方案以解决'基础连接已经关闭'错误。通过调整SchUseStrongCrypto注册表项,强制使用TLS 1.2等现代加密协议,确保安全连接。适用于企业环境部署和长期维护建议。 阅读详情

相关推荐

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 315

hibernate(七) hibernate中查询方式详解

      序言          之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西。就是因为缺少总结。在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数据表查询操作详解  ,以至于看这篇文章不用那么吃力。                                             --WH   一、hiber...

weixin_34032792的博客 309

海思HiMPP开发避坑指南:MMZ内存与系统内存傻傻分不清?一个例子讲透

本文深入解析海思HiMPP开发中MMZ内存与系统内存的关键差异与应用场景,帮助开发者避免常见的内存混淆问题。通过实际案例和性能对比,详细介绍了MMZ内存的特性和优化策略,提升多媒体处理效率。

weixin_30772105的博客 468

Hibernate特殊查询之查询全部内容(list)

Hibernate特殊查询之查询全部内容(list) Hibernate中如何实现查询表中全部数据并返回一个list集合 示例代码如下: public List findAll() { //获取Session Session session = HibernateUtil.openSession(); //等价的sql = select * form admin_inf

龙腾四海365的专栏 948

别再手动配IP了!用NI-USRP Configuration Utility快速搞定USRP 2954与LabVIEW连接

本文详细介绍了如何使用NI-USRP Configuration Utility快速配置USRP 2954与LabVIEW的连接,解决传统手动IP配置的繁琐问题。通过图形化工具自动完成设备发现、IP设置和连接验证,大幅提升软件无线电实验效率,特别适合信号收发应用场景。

weixin_27102543的博客 292

基于STM32L4XX、HAL库的AD7124模数转换器ADC驱动程序设计

/ 检查ID是否正确 (AD7124-4/AD7124-8有不同的ID)// 转换为电压值 (假设使用内部2.5V基准)// 构造读命令: 1(R/W) + 1(0) + 6(寄存器地址)// 构造写命令: 0(R/W) + 1(0) + 6(寄存器地址).config = 0, // 使用配置0。内置可编程增益放大器(PGA):1-128倍。// 读取ADC数据。// 读取当前ADC控制寄存器。// 检查数据是否就绪。// 写回ADC控制寄存器。// 初始化AD7124。

zhusl6688的博客 520

Hibernate 的多种查询方式

本文对 Hibernate 的多种查询方式、抓取策略和批量抓取进行了详细介绍。Hibernate 提供了多种查询方式和抓取策略,可以根据实际需求选择合适的方式和策略来提高系统的性能和稳定性。同时也需要注意不同的查询方式和抓取策略的使用场景,避免因为不当的使用方式导致系统性能下降的问题。

互联说 1237

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

图像增强(Image Enhancement):指不考虑图像降质原因,利用各种数学方法和变换手段,增强图像中人们感兴趣部分或提高有用的图像特征的清晰度。从图像质量来看,图像增强提高了图像的可懂度,改善了图像的视觉效果例如在现实场景中,针对那些对比度较差、视觉效果不好的图像,我们就可以利用图像增强改善视觉质量图像增强可分为如下几种基于灰度级变换的图像增强基于直方图修正的图像增强基于照度反射模型的图像增强基于模糊技术的图像增强基于伪彩色处理的图像增强其他图像增强方法分段线性灰度级变换。

快乐江湖的博客 3334

Hibernate多种查询方法

Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题 .查询整个映射对象所有字段Java代码//直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段Stringhql="fromUsers";Queryquery=session.crea...  1. 查询整个映射对象所有字段 Java代码      //直接from查询出来的是一个映射对

arno_dzl的博客 362

爆肝整理:微信公众号文章HTML编写完整规范,运营必备手册

微信公众号文章排版总是出错?📱 这份完整的HTML编写规范文档帮你彻底解决!文档包含所有支持的标签、CSS属性、实用代码模板和注意事项 📋,让你快速掌握微信文章的HTML编写技巧,告别第三方编辑器依赖 ✅

XiaoqiangClub的博客 2310

在 LangGraph 中集成 Skills 增强智能体能力

LangGraph 的核心是通过**状态机 + 节点(Node) + 工具(Tool)**来编排智能体流程,你可以把 Skills 理解为“封装好的工具或可复用的任务流”,下面是一套可落地的集成方案。

lpfasd123的博客 1179

hibernate的三种查询方式

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

2401_84411473的博客 1577

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hibernate查询之list/iterator

http://javakeith.iteye.com/blog/865175

杀客o凹胖 149

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

hibernate查询方法选择(List()与Iterator())

导读:   hibernate方法选择   a) 完成同样一件事,HIBERNATE提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回十万条记录(List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或Iterator的结果集,则不存在这样的问题。   b) Session的load/ge

我的世界我的梦 2577

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Hibernate学习之HQL详解1

Hibernate具有三种查询方式: HQL(Hibernate Query Language)检索 QBC(Query By Criteria)检索 Native SQL检索 以上三种查询方式都是通过Session对象 来操作的 HQL查询: 是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。 Hibernate使用Query接口来执行HQL语句,类似j

yjw916622874的专栏 927

Hibernate二级缓存设置

Hibernate二级缓存设置 二级缓存是SessionFactory层面的缓存并被所有的Session共享,故不像一级缓存Session一样需要调用flush进行清理(没有临时集合),但使用二级缓存必须配置外置的二级缓存插件,常见的二级缓存插件有 Ehcache OSCache JBoss Cache Infininspan 以常用的Ehcache为例(Hibernate版本5.5) 二级缓存的并发访问策略 1.准备相关的jar包,配置 net.sf.ehcache

jamenu的博客 764

Hibernate的缓存机制

 Hibernate的缓存机制 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的次数,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。   缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅

cnq2328的专栏 254

Hibernate之list和iterator

在Hibernate3中将Session.find(),Session.iterator()换成:session.createQuery().list(),session.createQuery().iterator(),(实现机制并没有什么区别); 两者都是根据指定条件查询并返回符合查询的条件的实体对象; 看下session.createQuery().list(): Jav...

dianti5444的博客 123

hibernate中Query的list和iterator区别

1、Test_query_list类 public class Test_query_iterator_list { public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext ac=new ClassP...

dielishang0645的博客 154

Hibernate中List、Iterator的区别

List和Iterator的区别 让我们先运行一下代码 实例:public void fillAll(){ Session session=HibernateUtil.getSession(); Query query=session.createQuery("from Customers"); List list=query.list(); for(Customers l:list)

x1n1010的专栏 797

Hibernate-ORM:05.Hibernate中的list()和iterator()

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- Hibernate中查多条(全部)使用list()或iterator() 本篇介绍:   1.如何使用list()和iterator();   2.list()和iterator的相同处与区别;   3.缓存对list()或iterator的影响; 一...

Qgee2013的博客 240

Hibernate Iterator JCS分析

JCS是一个对象Cache,它可以把Java对象缓存起来,提高那些访问频率很高的Java对象的存取效率。JCS是按照对象的唯一标示来存取对象的,比如说可以按照对象的hashCode来存取。对于Hibernate来说,可以利用JCS来缓存查询结果,这样当下次访问同样的数据,就无须去数据库取,直接从JCS中取出来,加快了查询速度。当Hibernate使用List或者Iterator方式来第一次读取数据

creamsmallpig的专栏 944

Hibernate : Query.list()、Query.iterator()的区别

Query上有list()与iterator()方法,两者的差别在于list()方法在读取数据时,并不会利用到快取,而是直接再向数据库查询,而iterator()则将读取到的数据写到快取,并于读取时再次利用。来看看下面的程序: Session session = sessionFactory.openSession();Query query = session.cre...

aoklzdl0711的博客 200

Hibernate Query查询的list方法和iterator方法区别

对于list方法而言,实际上Hibernate是通过一条Select SQL获取所有的记录。并将其读出,填入到POJO中返回。 而iterate 方法,则是首先通过一条Select SQL 获取所有符合查询条件的记录的id,再对这个id 集合进行循环操作, 通过单独的Select SQL 取出每个id 所对应的记录,之后填入POJO中返回。 也就是说,对于list 操作,需要一条

wuliEcho的博客 728
上一篇: Hibernate之查询缓存(The Query Cache)
下一篇: hibernate之延迟加载(Lazy Loading)
keithJava
博客等级 码龄16年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值