2013-02-19 20 views

Odpowiedz

4

Jeżeli przypadki są już w sesji (bufor podstawowy poziomu) i drugiego poziomu pamięci podręcznej iterate() daje lepsze wyniki.

Jeśli nie są już buforowane, iterate() będzie wolniejsze niż list() i może wymagać wielu trafień w bazie danych dla prostego zapytania.

+1

więc co z Criteria.iterator (ISN) ?, dlaczego Tam jest? –

+2

Problem polega na tym, że trudno jest zmienić kryteria z zapytania na zapytanie bez zmiany interfejsu, ponieważ zwracane typy danych są różne. Dodanie obsługi Iteratora do Kryteriów powinno być tak proste jak zawijanie ScrollableResult w implementacji Iterator, a to pozwoliłoby na powrót Iteratora zarówno z HQL jak i Criteria. –

+0

thx za odpowiedź informacyjną. –

3

Javadoc mówi:

zwróci wyniki kwerendy jako iterator. Jeśli zapytanie zawiera wiele wyników przed wierszem, wyniki są zwracane w instancji Object [].

Podmioty zwracane w wynikach są inicjowane na żądanie. Pierwsza kwerenda SQL zwraca tylko identyfikatory.

(kopalni nacisk)

12

Query.list(): Wykonuje 1 zapytanie SQL i ładuje całe dane. Nawet jeśli rekordy są obecne w pamięci podręcznej, wykonywane jest nowe zapytanie SQL w celu załadowania rekordów z bazy danych.

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(): Wykonuje 1 + N zapytań SQL. Pierwsze zapytanie zwraca tylko identyfikator wszystkich rekordów i kiedy iterator jest iterowany, to za każdym razem wykonywane jest oddzielne zapytanie SQL zawierające klauzulę WHERE, taką jak "WHERE id = N". Jeśli rekordy są obecne w pamięci podręcznej, wówczas wykonywane jest pierwsze zapytanie, a pozostałe zapytania N nie są wykonywane, a rekordy są uzyskiwane z pamięci podręcznej.

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

Do listy():

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

Na iteracyjne():

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