使用Query.list()
和Query.iterator()
之间有什么区别?
使用其中任何一项都有任何性能提升。我的意思是他们中的任何一个都在实施lazy loading?
或者Query.iterator()最终与query.list().iterate()
为什么没有 只有Criteria.iterator()
Criteria.list()
答案 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=?
}