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 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语句的问题。

时间: 2024-11-05 12:18:19

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

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

打开cache后query的list和iterator方法区别 1.ehcache.xml文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

Hibernate中get()和load()方法的区别

在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对象时是有区别的,在查询性能上两者是不同的. 一.load加载方式 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出SQL语句,当前得到的这个对象其实是一个代理对象,这个代理对象

Hibernate 中get()与load()方法的区别

一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null 而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定

hibernate中load和get方法的区别

1.读取时机不同(当lazy=true的时候)    load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延  迟机制(get语句时马上读库): 2.搜索不到数据时的情况    当搜索的数据不存在的时候,load依然会返回一个对象,在你使用该对象的非主键数  据时,会抛出异常:    当搜索的数据不存在的时候,get会返回一个null:  其实看似load到用的时候才去读数据库,比get要节省资源,但还没深入研究过. 3.get不支持lazy   load支持la

hibernate 中 query.list()的优化

今天做项目遇到一个需求,问题是在调用query.list()的时候,因为数据也多大概700条左右,查询一次需要30s+,这简直是不能忍,于是开始考虑怎么优化. 1.因为是单表查询,不涉及表间的复杂关联,所以想到的是可能是没加索引吧,那我就加上索引,重新启动项目查询,没有改变. 2.有人说是session连接没有释放,也就是session.colse(),对我这不适用.也有人说这是数据库连接过多了吧,自己的连接池太小了,那我就从500变成5000,依旧没变化. 3.问题还没有解决,有人说query

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

一.query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示.那么两者区别,以及两者的效率如何? 答:1.scroll是用JDBC2.0的可滚动结果集实现:query.setMaxResults();query.setFirstResult()是数据库SQL语句实现. 2.你说是在数据库就分页好呢?还是把结果集都取到内存再分页好呢?(应该是在数据库就分了好些吧,但是如果在内存分页

(转)Hibernate中的Query一些基本用法

/*** 添加*/public void save(Stu stu){ try { tran=this.GetSession().beginTransaction(); this.GetSession().save(stu); tran.commit(); } catch (HibernateException e) { throw e; }finally{ this.CloseSession(); }} /*** 使用HQL全查询*/public List getallbyHQL(){ Lis

Hibernate中使用load和get加载的区别

一. Hibernate使用load机制和使用get加载的区别(重点) 1.相同点:get 和load他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例 2. 不同点:如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception. 2.1get 是直接从数据库中检索   而load会使用懒加载(延迟加载)产生一个代理对象,属性oid 2.2 使用load加载,Hibernate会认为该id对应的对象是一定存在的,所

Hibernate中get方法和load方法的区别

1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常: get方法检索不到的话会返回null: 2.从检索执行机制上对比: load方法的执行则比较复杂首先查找session的persistent Context(一级缓存)中是否有缓存,如果有则直接返回,如果没有则去查找二级缓存,如果有则返回,如果没有则判断是否是lazy,若不是lazy,直接访问数据库检索,查到记录返回(并且同时在二级缓存中存放查到的数据方便下次使