浅谈Hibernate中的几个查询

一、load和get方法的区别

1、load在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时候才会进入二级缓存查找或到数据库加载数据,如果数据库中没有找到则抛出一个ObjectNotFoundException;

2、get方法在查询时,同样是先从一级缓存中寻找与数据索引对应的实体对象,如果有则直接返回该实体对象,如果没有则马上进入二级缓存查找或到数据库加载数据,查找到则直接返回查询对象,没有则返回一个null;

二、list和iterator

1 、list方法会直接直接到数据库中加载数据,然后将查询结果放入缓存中,当然如果你配置了查询缓存,他会先进入查询缓存寻找,如果没有满足条件的再进入数据库加载数据;

2、iterator方法在查询时是先从数据库中查询出所有满足条件的数据索引,然后再根据这些数据索引进入一级和二级缓存进行匹配,如果对于数据索引有实体对象则直接返回该对象,如果没有则在具体使用对象的时候才会进入数据库加载数据,并且把数据索引和对于实体对象放进缓存;

3、什么时候使用最合适呢?个人建议第一次查询使用list直接从数据库中读取所有数据,然后放到了缓存中,后面使用Iterator,直接从缓存中读取,利于提高性能;

三、延迟加载

1、对于load方法,它在查询对象的时候始终返回的一个代理对象,那么为什么hibernate要引入这么一个方式呢,为什么不像get方法一样直接返回查询对象呢?出于对hibernate的性能考虑,hibernate则提出了一个解决方案,那就是延迟加载,这里load方法的使用则正是实体对象延迟加载的表现。

2、hibernate中list和Iterator 区别,延迟加载

对于Query接口的list()和Iterator()方法来说,都可以实现获取查询的对象,但是list() 方法返回的是每一个对象都是完整的(对象的每一个属性都被表中的字段填充上了),而Iterator()方法返回的对象中仅包含了主键值(标识符),只有当你对Iterator中的对象进行操作时,Hibernate才会向数据库发送SQL语句来获取属性值。
Iterator操作代码
Query q = session.createQuery("from UserModel");
Iterator<UserModel> iter = q.iterate();
while(iter.hasNext()){
System.out.println(iter.next());
}

list操作代码
Query q = session.createQuery("from UserModel");
List<UserModel> list = q.list();
for(Iterator<UserModel> iter = list.iterator();iter.hasNext();){
System.out.println(iter.next());

转载于:https://blog.51cto.com/longx/1357697

浅谈Hibernate中的几个查询相关推荐

  1. 浅谈 MySQL 中优化 SQL 语句查询常用的 30 种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  2. 浅谈MySQL中优化sql语句查询常用的30种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  3. Java hibernate假外键_浅谈hibernate急迫加载问题(多重外键关联)

    数据库结构如下 strategy中有外键member_id(关联member表)外键strategy_category(关联category表)而member表中有外键position_id(关联po ...

  4. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  5. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. 【网摘】 浅谈HTTP中GET与POST的区别

    文章出处:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html 浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不 ...

  7. 浅谈oracle树状结构层级查询

    oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只要精通数据库那么对于java开发你 ...

  8. 浅谈CTF中各种花式绕过的小trick

    文章目录 浅谈CTF中各种花式绕过的小trick 前言 md5加密bypass 弱比较绕过 方法一:0e绕过 方法二:数组绕过 强比较绕过 方法:数组绕过 md5碰撞绕过 方法:使用Fastcoll生 ...

  9. 单一修改高程值lisp_浅谈AutoCAD中修改高程的四种方法

    浅谈 AutoCAD 中修改高程的四种方法 摘 要: 在使用 AutoCAD 进行数字化成图工作中,经常遇到线划的标高不为零,及高程点的值与实地不符,需要对其进行修改等情况,结合实 际工作经验,简单介 ...

最新文章

  1. int能表示的数据范围(在VS2017下,int和long都是32位)
  2. 【转载】绝对干货!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载九)如何通过源代...
  3. C++ primer记录
  4. SCCM PXE客户端无法加载DP(分发点)映像
  5. ZZULIOJ 1092: 素数表(函数专题)
  6. 人工智障学习笔记——机器学习(8)K均值聚类
  7. pagePiling.js - 创建美丽的全屏滚动效果
  8. 学习ASP.NET Core Razor 编程系列六——数据库初始化
  9. swagger注释API详细说明
  10. Express框架学习笔记-静态资源的处理
  11. 《数据结构 严蔚敏C》期末高频考题整理(含详解)
  12. vb mysql 实例教程_在VB.NET应用中使用MySQL的方法
  13. Android 动画录制 GIF录制
  14. 浏览器插件 - Chrome 对 UserScript 的声明头(metadata)兼容性一览
  15. hazelcast java_Java分布式内存开源实现:Hazelcast
  16. Sketch 的基本操作(一)
  17. 60mph和kmh换算_mph换算器(速度计算器在线)
  18. Canvas学习笔记及像素操作——实现马赛克
  19. Java中高级程序员全程学习路线图
  20. 超表面远场三维辐射图,MATLAB

热门文章

  1. spring的事务回滚机制,事务原理
  2. freemarker文件乱码问题
  3. revit模型怎么在手机上看_沙盘模型应该怎么看?一定要警惕这些问题
  4. graph-easy使用简介
  5. linux下C语言简单实现线程池
  6. 吉林大学计算机高级程序设计笔记
  7. @Resource注解使用详解
  8. Hystrix 线程池隔离与接口限流
  9. js中用script 嵌套script块
  10. HTTP Status 500 - javax.servlet.ServletException: File [/head.jsp] not found