The difference between query.list and query.iterate

What exactly is the difference between use Query.list()and Query.iterator()?

Are there any performance improvements when using. I mean, does any of them implement lazy loading ?

Or Query.iterator () is ultimately the same asquery.list().iterate()

Also why not Criteria.iterator() Criteria.list()

+5
source share
4 answers

If the instances are already in the session (primary level cache) or second level cache iterate(), this will give better performance.

If they are not cached yet, it iterate()will be slower than list(), and a simple query may require many database queries.

+4

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-. , , , SQL-, WHERE, "WHERE id = N". , , 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
}
+12

javadoc :

. , Object [].

Objects are returned as results are initialized on demand. The first SQL query returns only identifiers.

(emphasis mine)

+3
source
+----------------------------------------------+-----------------------------------------------+
|                    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                                  |
+----------------------------------------------+-----------------------------------------------+  

For list ():

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

For iteration ():

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

All Articles