query.list和query.iterate之间的区别

时间:2013-02-19 12:12:58

标签: java hibernate

使用Query.list()Query.iterator()之间有什么区别?

使用其中任何一项都有任何性能提升。我的意思是他们中的任何一个都在实施lazy loading

或者Query.iterator()最终与query.list().iterate()

相同

为什么没有 Criteria.iterator() 只有Criteria.list()

4 个答案:

答案 0 :(得分:14)

Query.list():执行1个SQL查询并加载整个数据。即使记录存在于缓存中,也会执行新的SQL查询以从数据库加载记录。

List<Employee> list1 = session.createQuery("from Employee").list(); // SELECT *FROM EMP
for (Employee e : list1) {
    System.out.println(e);
}
List<Employee> list2 = session.createQuery("from Employee").list(); // SELECT *FROM EMP
for (Employee e : list2) {
    System.out.println(e);
}

Query.iterate():执行1 + N个SQL查询。第一个查询只返回所有记录的标识符,并且当迭代返回的迭代器时,每次执行包含WHERE子句(如“WHERE id = N”)的单独SQL查询。如果记录存在于缓存中,则执行第一个查询,不执行其余N个查询,并从缓存中获取记录。

Iterator<Employee> iterator1 = session.createQuery("from Employee").iterate(); // SELECT EMP_ID FROM EMP
while(iterator1.hasNext()) {
    System.out.println(iterator1.next()); // SELECT * FROM EMP WHERE EMP_ID=?
}
Iterator<Employee> iterator2 = session.createQuery("from Employee").iterate(); // SELECT EMP_ID FROM EMP
while (iterator2.hasNext()) {
    System.out.println(iterator2.next()); // From cache, no SQL
}

答案 1 :(得分:4)

如果实例已在会话中(主级缓存)或第二级缓存iterate()将提供更好的性能。

如果它们尚未缓存,iterate()将慢于list(),并且可能需要许多数据库命中才能进行简单查询。

答案 2 :(得分:3)

javadoc说:

  

将查询结果作为迭代器返回。如果查询在前一行包含多个结果,则结果将在Object []的实例中返回。

     

根据需要初始化结果时返回的实体。第一个SQL查询仅返回标识符。

(强调我的)

答案 3 :(得分:1)

+----------------------------------------------+-----------------------------------------------+
|                    list()                    |                   iterate()                   |
+----------------------------------------------+-----------------------------------------------+
| Return type is List                          | Return type is Iterate                        |
| All records loads at single database request | For each record, one database hit is made     |
| This is faster if cache is not available     | This is very slower if cache is not available |
| Eager loading                                | Lazy loading                                  |
+----------------------------------------------+-----------------------------------------------+  

对于list():

Query query = session.createQuery("from Employee");
List list = query.list(); // SELECT * FROM EMP
Iterator iterator = list.iterator();
while(iterator.hasNext()){
}  

对于iterate():

Query query = session.createQuery("from Employee");
Iterator iterator = query.iterate(); // SELECT * FROM EMP
while(iterator.hasNext()){
    // SELECT * FROM EMP WHERE EMP_ID=?
}