hibernate中Query的list和iterator区别

时间:2023-03-09 02:16:29
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语句的问题。