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
结果一次性全部查出,据说不能用二级缓存,也不知道真假