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
}
więc co z Criteria.iterator (ISN) ?, dlaczego Tam jest? –
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. –
thx za odpowiedź informacyjną. –