1、Test_query_list类

public class Test_query_iterator_list {

    public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
Session session=sessionFactory.openSession();
String hql="from User where id<=3";
List<User> users=session.createQuery(hql).list();
System.out.println("***************************************");
for (User user: users) {
System.out.println(user);
}
session.close();
} }

测试结果为:

Hibernate:
select
user0_.id as id0_,
user0_.name as name0_
from
mydb.user user0_
where
user0_.id<=3
***************************************
User [id=1, name=LI]
User [id=2, name=sara2]
User [id=3, name=sara3]

public class Test_query_iterator_list {

    public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
Session session=sessionFactory.openSession();
String hql="from User where id<=3";
Iterator<User> iterator=session.createQuery(hql).iterate();
System.out.println("***************************************");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
session.close();
}
}

输出结果为:

Hibernate:
select
user0_.id as col_0_0_
from
mydb.user user0_
where
user0_.id<=3
***************************************
Hibernate:
select
user0_.id as id0_0_,
user0_.name as name0_0_
from
mydb.user user0_
where
user0_.id=?
User [id=1, name=LI]
Hibernate:
select
user0_.id as id0_0_,
user0_.name as name0_0_
from
mydb.user user0_
where
user0_.id=?
User [id=2, name=sara2]
Hibernate:
select
user0_.id as id0_0_,
user0_.name as name0_0_
from
mydb.user user0_
where
user0_.id=?
User [id=3, name=sara3]

结论:

  可以看出list每次都是通过一条语句直接操作数据库取出所有的数据返回(并且将对象存入hibernate缓存);iterator首先通过一条语句取出所有数据的id,然后通过id在hibernate的一级缓存中查找是否存在该对象,如果存在则直接取出,如果没有则再次发出一条sql语句通过id取得对象(并且加入到缓存中),这样如果所有的id在缓存中都没有的话就会出现n+1条sql语句的问题。

hibernate中Query的list和iterator区别的更多相关文章

  1. hibernate中Query的list和iterator区别(续)

    打开cache后query的list和iterator方法区别 将query 的cache打开的话,缓存的是query本身,以hql 生成的 sql ,再加上参数,分页等信息做为key值,而不是que ...

  2. Hibernate中Query.list()方法报IllegalArgumentException异常

    最近在使用Hibernate开发项目,在写好hql语句,并初始化Query对象,执行Query.list()方法时,应用报IllegalArgumentException异常.经网上查询,现已经基本决 ...

  3. query 的list()和iterator()区别

    区别: 1.返回的类型不一样,list返回List,iterate返回iterator. 2.查询策略不同.(获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中获取id,然后 ...

  4. hibernate中load和get方法的区别

    1.读取时机不同(当lazy=true的时候)    load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延  迟机制(get语句时马上读库): 2.搜索不到数据时的情 ...

  5. 【hibernate】Hibernate中save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  6. hibernate 中 query.list()的优化

    2018年3月15日  今天做项目遇到一个需求,问题是在调用query.list()的时候,因为数据也多大概700条左右,查询一次需要30s+,这简直是不能忍,于是开始考虑怎么优化. 1.因为是单表查 ...

  7. hibernate中@Entity和@Table的区别

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库.这些普通Java对象被称作Entity Bean.除了是用Java Persis ...

  8. hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别

    hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...

  9. Hibernate中的query.setFirstResult(),query.setMaxResults();

    一.query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示.那么两者区别,以及两 ...

随机推荐

  1. Maven详解(三)------ Maven工程目录介绍

    上一章我们配置并安装好了 Maven,那么这一章我们介绍如何用eclipse创建一个 Maven 工程,然后介绍 Maven 工程的目录结构. 1.eclipse 创建 Maven 工程 第一步:Fi ...

  2. ios逆向过程中lldb调试技巧

    在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f  看看各个模块在内存中的基址 2.register read r0  读取寄存器r0的 ...

  3. C# 隐藏文件

    void SerializeXmlNodes(XmlSerializer serialize, string filePath, List<XmlNode> nodes) { using ...

  4. Catalan数——卡特兰数

    一.Catalan数的定义 令h(0)=1,h(1)=1,Catalan数满足递归式:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0)  (n& ...

  5. 多线程编程学习一(Java多线程的基础).

    一.进程和线程的概念 进程:一次程序的执行称为一个进程,每个 进程有独立的代码和数据空间,进程间切换的开销比较大,一个进程包含1—n个线程.进程是资源分享的最小单位. 线程:同一类线程共享代码和数据空 ...

  6. c# typeof 与 GetType 作用与区别

    官方解释: Used to obtain the "System.Type" object for a type. A 'typeof' expression takes the ...

  7. Windows上安装nvm--nodejs版本管理器

    nvm最新的下载地址 Node版本管理器--nvm,可以运行在多种操作系统上.nvm for windows 是使用go语言编写的软件. 我电脑使用的是Windows操作系统,所以我要记录下在此操作系 ...

  8. pycharm远程linux开发和调试代码

    pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...

  9. Google推出移动网页开发者认证考试 价格99美元

    如果您是移动网页开发人员,希望了解您的编码实力,Google将推出一个认证流程,让您可以参加考试,如果您通过,可以在您的简历,网站和其他在线上显示电子徽章配置文件.           此外,潜在的雇 ...

  10. 6.分析request_irq和free_irq函数如何注册注销中断

    上一节讲了如何实现运行中断,这些都是系统给做好的,当我们想自己写个中断处理程序,去执行自己的代码,就需要写irq_desc->action->handler,然后通过request_irq ...