hibernate的query.iterate()与query.list()的区别(四)

Query query=this.GetSession().createQuery(hql);
query.iterate()与query.list()
效率是说query.iterate()比query.list()好,但做了N+1次查询
它们都是先从数据库的查询出主键值,然后根据主键值查询出对象,
只是query.iterate()会根据主键值先从缓存当中找,若没有就从数据库查询
query.list()会根据主键值在数据库查询(N+1)。

==================================================================

query.scroll(ScrollMode.SCROLL_SENSITIVE);


iterator()获取方法后非常的乱,sql语句非常之多,

list()非常简洁,还是不懂为啥要用iterator


package com.bjsxt.hibernate;

import java.util.Date;
import java.util.Iterator;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;


public class HibernateQLTest {
	private static SessionFactory sf;
	
	public static void beforeClass() {
		sf = new AnnotationConfiguration().configure().buildSessionFactory();
	}
	public static void afterClass() {
		sf.close();
	}
	
	public void testSchemaExport() {
		new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
	}
	
	public void testSave() {
		Session session = sf.openSession();
		session.beginTransaction();
		
		for(int i=0; i<10; i++) {
			Book c = new Book();
			c.setName("c" + i);
			session.save(c);
		}
		
		for(int i=0; i<10; i++) {
			Category c = new Category();
			c.setName("c" + i);
			session.save(c);
		}
		
		for(int i=0; i<10; i++) {
			Category c = new Category();
			c.setId(1);
			Topic t = new Topic();
			t.setCategory(c);
			t.setTitle("t" + i);
			t.setCreateDate(new Date());
			session.save(t);
			
		}
		
		for(int i=0; i<10; i++) {
			
			Topic t = new Topic();
			t.setId(1);
			Msg m = new Msg();
			m.setCont("m" + i);
			m.setTopic(t);
			session.save(m);
			
		}
		session.getTransaction().commit();
		session.close();
	}
	
	//list 与 iterate 
	public void testQuery5() {
		Session session = sf.openSession();
		session.beginTransaction();
		Iterator<Topic> topics = session.createQuery("from Topic").iterate();
		while(topics.hasNext()){ 
			System.out.println(".-------------------"+topics.next().getTitle());
		}
		
		Iterator<Topic> topics2 = session.createQuery("from Topic").iterate();
		while(topics2.hasNext()){ 
			System.out.println("@@@@@@@@@@@@@@@@@@@@@@"+topics2.next().getTitle());
		}
		
		
		session.getTransaction().commit();
		session.close();
	}
	
	//list 与 iterate 
	public void testQuery6() {
		Session session = sf.openSession();
		session.beginTransaction();
		Iterator<Topic> topics = session.createQuery("from Topic").list().iterator();
		while(topics.hasNext()){ 
			System.out.println(topics.next().getTitle());
		}
		
		Iterator<Topic> topics2 = session.createQuery("from Topic").list().iterator();
		while(topics2.hasNext()){ 
			System.out.println(topics2.next().getTitle());
		}
		
		
		session.getTransaction().commit();
		session.close();
	}
	
	public static void main(String[] args) {
		HibernateQLTest test = new HibernateQLTest();
		beforeClass();
//		test.testSchemaExport();
//		test.testSave();
		test.testQuery5();
//		test.testQuery6();
		afterClass();

testQuery5()查询两次,

testQuery6(查询了2次

Hibernate: 
    select
        topic0_.id as id1_3_1_,
        topic0_.category_id as category4_3_1_,
        topic0_.createDate as createDa2_3_1_,
        topic0_.title as title3_3_1_,
        category1_.id as id1_1_0_,
        category1_.name as name2_1_0_ 
    from
        Topic topic0_ 
    left outer join
        Category category1_ 
            on topic0_.category_id=category1_.id 
    where
        topic0_.id=?
.-------------------t7
Hibernate: 
    select
        topic0_.id as id1_3_1_,
        topic0_.category_id as category4_3_1_,
        topic0_.createDate as createDa2_3_1_,
        topic0_.title as title3_3_1_,
        category1_.id as id1_1_0_,
        category1_.name as name2_1_0_ 
    from
        Topic topic0_ 
    left outer join
        Category category1_ 
            on topic0_.category_id=category1_.id 
    where
        topic0_.id=?
.-------------------t8
Hibernate: 
    select
        topic0_.id as id1_3_1_,
        topic0_.category_id as category4_3_1_,
        topic0_.createDate as createDa2_3_1_,
        topic0_.title as title3_3_1_,
        category1_.id as id1_1_0_,
        category1_.name as name2_1_0_ 
    from
        Topic topic0_ 
    left outer join
        Category category1_ 
            on topic0_.category_id=category1_.id 
    where
        topic0_.id=?
.-------------------t9
Hibernate: 
    select
        topic0_.id as col_0_0_ 
    from
        Topic topic0_
@@@@@@@@@@@@@@@@@@@@@@t0
@@@@@@@@@@@@@@@@@@@@@@t1
@@@@@@@@@@@@@@@@@@@@@@t2
@@@@@@@@@@@@@@@@@@@@@@t3
@@@@@@@@@@@@@@@@@@@@@@t4
@@@@@@@@@@@@@@@@@@@@@@t5
@@@@@@@@@@@@@@@@@@@@@@t6
@@@@@@@@@@@@@@@@@@@@@@t7
@@@@@@@@@@@@@@@@@@@@@@t8
@@@@@@@@@@@@@@@@@@@@@@t9
test5结果
由结果可知,

iterator 一条一条的查询,而且第二次查询有缓存


test6结果

        topic0_.category_id as category4_3_,
        topic0_.createDate as createDa2_3_,
        topic0_.title as title3_3_ 
    from
        Topic topic0_
Hibernate: 
    select
        category0_.id as id1_1_0_,
        category0_.name as name2_1_0_ 
    from
        Category category0_ 
    where
        category0_.id=?
t0
t1
t2
t3
t4
t5
t6
t7
t8
t9
Hibernate: 
    select
        topic0_.id as id1_3_,
        topic0_.category_id as category4_3_,
        topic0_.createDate as createDa2_3_,
        topic0_.title as title3_3_ 
    from
        Topic topic0_
t0
t1
t2
t3
t4
t5
t6
t7
t8
t9

结果一次性全部查出,据说不能用二级缓存,也不知道真假



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静山晚风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值