hibernate中list和iterator方法的区别

主要区别如下:

  1. 获取的方式不一样
    List的获取方式为:List<Customers> list = query.list();
    Iterator的获取方式:Iterator<Customers> it = query.iterate();

  2. list输出一条语句,而iterator输出的是两条sql语句,我们可想一下,为什么会输出这样的效果?

因为他们获取数据的方式不一样,list()会直接查询数据库,iterator()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1次

3.list只查询一级缓存,而iterator会从二级缓存中查
4. list方法返回的对象都是实体对象,而iterator返回的是代理对象
5. session中list第二次发出,仍会到数据库査询
6. iterate 第二次,首先找session 级缓存

举个栗子:

public void listQuery() {

       Configuration configuration = new Configuration().configure();

       SessionFactory factory = configuration.buildSessionFactory();

       Session session = factory.openSession(); 

        Query query = session.createQuery("from Customers");

       List<Customers> list = query.list();

       for(Customers entity:list){

           System.out.println(entity.toString());

       }

}

List执行结果为:

Hibernate: select customers0_.id as id0_, customers0_.realName as realName0_, customers0_.pass as pass0_, customers0_.sex as sex0_, customers0_.petName as petName0_, customers0_.email as email0_, customers0_.rdate as rdate0_ from customers customers0_

cn.csdn.products.domain.Customers@5bf624
   public void iterateQuery(){

       Configuration configuration = new Configuration().configure();

       SessionFactory factory = configuration.buildSessionFactory();

       Session session = factory.openSession();

       Query query = session.createQuery("from Customers");

       Iterator<Customers> it = query.iterate();

       // 遍历出来所有的查询结果

       while (it.hasNext()) {

           Customers customer = it.next();

           System.out.println(customer.toString());

       }

    }

使用iterator执行结果为:

Hibernate: select customers0_.id as col_0_0_ from customers customers0_

Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from customers customers0_ where customers0_.id=?

cn.csdn.products.domain.Customers@1d13272

list()方法在执行时,直接运行查询结果所需要的查询语句。

iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。

因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).

结果集的处理方法不同:

list()方法会一次取出所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。

iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。

如果数量巨大的话,建议用iterator

猜你喜欢

转载自blog.csdn.net/qq_38070608/article/details/80466151
今日推荐