hibernate list和iterate的区别

1.*list是立刻加载:

package com.test;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.factory.HibernateSessionFactory;
import com.pojo.Books;



public class Test4 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Session session=HibernateSessionFactory.getSession();
		System.out.println("1: "+session);
		session.beginTransaction();
		
		Query query=session.createQuery("from Books where id<?");
		query.setInteger(0, 3);
		List<Books> list=query.list();
		for(Books b:list){
			System.out.println(b.getId()+"\t"+b.getName()+"\t"+b.getAuthor()+
                        "\t"+b.getPrice());
		}
		session.getTransaction().commit();
		HibernateSessionFactory.closeSession();
		System.out.println("4: "+session);
		
	}

}
   此次查询会产生一条sql语句:

  

Hibernate: 
    select
        books0_.id as id0_,
        books0_.name as name0_,
        books0_.price as price0_,
        books0_.opendate as opendate0_,
        books0_.enddate as enddate0_,
        books0_.author as author0_ 
    from
        test.books books0_ 
    where
        books0_.id<?

   执行list之后的session中已放入数据:

   SessionImpl(PersistenceContext[entityKeys=[EntityKey[com.pojo.Books#2], EntityKey[com.pojo.Books#1]],collectionKeys=[]];ActionQueue[insertions=[] updates=[]           deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])

    *iterate是延迟加载:

    iterate只查询出数据表中的所有主键id列表,当需要该对象其他数据时才会根据主键去数据库中查询

package com.test;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.factory.HibernateSessionFactory;
import com.pojo.Books;



public class Test4 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Session session=HibernateSessionFactory.getSession();
		System.out.println("1: "+session);
		session.beginTransaction();
                Query query2=session.createQuery("from Books where id=?");
		query2.setInteger(0, 5);
		Iterator<Books> books=query2.iterate();
		while(books.hasNext()){
			Books book=books.next();
			System.out.println(book.getName());
		}
		System.out.println("2: "+session);
		
		session.getTransaction().commit();
		HibernateSessionFactory.closeSession();
		
	}

}

执行以上代码会产生n+1条sql语句:

Hibernate: 
    select
        books0_.id as col_0_0_ 
    from
        test.books books0_ 
    where
        books0_.id=?
Hibernate: 
    select
        books0_.id as id0_0_,
        books0_.name as name0_0_,
        books0_.price as price0_0_,
        books0_.opendate as opendate0_0_,
        books0_.enddate as enddate0_0_,
        books0_.author as author0_0_ 
    from
        test.books books0_ 
    where
        books0_.id=?

2. list对一级缓存是可写不可读

    

Query query=session.createQuery("from Books where id<?");
		query.setInteger(0, 3);
		List<Books> list=query.list();
		for(Books b:list){
			System.out.println(b.getId()+"\t"+b.getName()+"\t"+b.getAuthor()+"\t"+b.getPrice());
		}
		Query query2=session.createQuery("from Books where id<?");
		query2.setInteger(0, 3);
		List<Books> list2=query2.list();
		for(Books b:list2){
			System.out.println(b.getId()+"\t"+b.getName()+"\t"+b.getAuthor()+"\t"+b.getPrice());
		}
虽然查询条件一样,但是每使用一次list就会查询一次数据库

    iterate对1级缓存可写也可读:

    缓存中只有主键列表



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值