Query.list(): Esegue 1 query SQL e carica l'intero dato. Anche se i record sono presenti nella cache, viene eseguita una nuova query SQL per caricare i record dal database.
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(): Esegue 1 + N query SQL. La prima query restituisce solo l'identificativo di tutti i record e quando l'iteratore restituito viene iterato ogni volta che viene eseguita una query SQL separata che contiene una clausola WHERE come "WHERE id = N". Se i record sono presenti nella cache, viene eseguita la prima query e le restanti N query non vengono eseguite e i record vengono ottenuti dalla cache.
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
}
fonte
2013-03-23 16:27:56
E per quanto riguarda la Criteria.iterator() ?, perché ISN è lì? –
Il problema è che rende difficile cambiare da criteri a query senza modificare l'interfaccia, poiché i tipi di dati restituiti sono diversi. Aggiungere il supporto di Iterator ai criteri, dovrebbe essere semplice come avvolgere ScrollableResult in un'implementazione di Iterator e consentirebbe di restituire un Iterator con HQL e Criteria. –
thx per la risposta informativa. –