List和Iterator在用hibernate查询时候的区别
来源:互联网 发布:北京口语培训班 知乎 编辑:程序博客网 时间:2024/06/05 16:05
List和Iterator的区别
让我们先运行一下代码
实例:public void fillAll(){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from Customers");
List<Customers> list=query.list();
for(Customers l:list){
System.out.println(l.getEmail());
}
执行结果:Hibernate: selectcustomers0_.id as id0_, customers0_.realName as realName0_, customers0_.pass aspass0_, customers0_.sex as sex0_, customers0_.petName as petName0_,customers0_.email as email0_, customers0_.rdate as rdate0_ from Customers customers0_
null
asd
null
}
@Test
public void fillA(){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from Customers");
Iterator<Customers> it=query.iterate();
while(it.hasNext()){
Customers c=(Customers) it.next();
System.out.println(c.getEmail());
}
}
执行结果:Hibernate: select customers0_.id as col_0_0_ from Customers customers0_
Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?
null
Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?
asd
Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?
Null
很明显的看出:Iterator输入的sql语句多:N+1条语句
总结:
Query的两个方法,list()和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,
1:返回的类型不一样,list()返回List,iterate()返回Iterator,
2: 获取数据的方式不一样,list()会直接查数据库,iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。
3:iterate会查询2级缓存, list只会查询一级缓存。
4: list()中返回的List中每个对象都是原本的对象,iterate()中返回的对象是代理对象.(debug可以发现)
list()方法在执行时,直接运行查询结果所需要的查询语句。
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).
结果集的处理方法不同:
list()方法会一次取出所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
如果数量巨大的话,建议用iterator
本文转载:http://blog.csdn.net/java958199586/article/details/7104315
- List和Iterator在用hibernate查询时候的区别
- Hibernate Query查询的list方法和iterator方法区别
- Hibernate查询的list与iterator区别
- 【Hibernate】中Query对象在获取表的所有的数据的时候,使用list()和 iterator()有什么区别?
- hibernate -- list和iterator方法的区别
- Hibernate--- list和iterator方法的区别
- hibernate -- list和iterator方法的区别
- Hibernate之Query查询的list()方法和iterator()方法的区别
- Hibernate之Query查询的list()方法和iterator()方法的区别
- Hibernate学习——Tip1 关于查询中list和iterator的区别
- Hibernate面试题 --- list和iterator方法的区别
- hibernate取数据时iterator和list的区别
- Hibernate取数据时iterator和list的区别
- hibernate中 list和iterator方法的区别
- Hibernate中Query.list()和Query.iterator()的区别
- Hibernate面试题 --- list和iterator方法的区别
- HIbernate——list和iterator的区别
- Query对象在获取表的所有的数据的时候,使用list()和 iterator()有什么区别?
- HDU 1.2.2 Box of Bricks
- android Bitmap使用技巧
- IOS Runtime
- 运用JS设置cookie、读取cookie、删除cookie
- 在OJ上的代码也能看,不用怕上传之后忘了保存的代码丢掉了
- List和Iterator在用hibernate查询时候的区别
- CareerCup 17 中等难题 Q17.4 不用比较找出两数较大值
- kinetis 学习之(一) GPIO
- IOS - UIImage
- Docker的特性解析
- Java压缩技术(四) GZIP——Java原生实现
- JProfiler 解决 Java 服务器的性能跟踪
- HDU 1.2.3 The Seven Percent Solution
- java.lang.OutOfMemoryError