2013-02-19 3 views

Antwort

4

Wenn Instanzen sind bereits in der Sitzung (primär-Level-Cache) oder Second-Level-Cache iterate() wird eine bessere Leistung geben.

Wenn sie nicht bereits zwischengespeichert sind, ist iterate() langsamer als list() und erfordert möglicherweise viele Datenbanktreffer für eine einfache Abfrage.

+1

so was über die Criteria.iterator() ?, warum isn Ist es da? –

+2

Das Problem besteht darin, dass es schwierig ist, von Kriterien zu Abfrage zu wechseln, ohne die Schnittstelle zu ändern, da die zurückgegebenen Datentypen unterschiedlich sind. Das Hinzufügen von Iterator-Unterstützung zu Criteria sollte so einfach sein wie das Wrappen von ScrollableResult in einer Iterator-Implementierung und es würde ermöglichen, einen Iterator mit HQL und Kriterien zurückzugeben. –

+0

Danke für die informative Antwort. –

3

Die javadoc sagt:

Return die Abfrageergebnisse als Iterator. Wenn die Abfrage mehrere Ergebnisse vor der Zeile enthält, werden die Ergebnisse in einer Instanz von Object [] zurückgegeben.

Entitäten, die als Ergebnis zurückgegeben werden, werden bei Bedarf initialisiert. Die erste SQL-Abfrage gibt nur Kennungen zurück.

(Hervorhebung von mir)

12

Query.list(): Führt 1 SQL-Abfrage aus und lädt die gesamten Daten. Selbst wenn die Datensätze im Cache vorhanden sind, wird eine neue SQL-Abfrage ausgeführt, um die Datensätze aus der Datenbank zu laden.

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(): Führt 1 + N SQL-Abfragen. Die erste Abfrage gibt nur den Bezeichner aller Datensätze zurück, und wenn der zurückgegebene Iterator wiederholt wird, wird jedes Mal eine separate SQL-Abfrage ausgeführt, die eine WHERE-Klausel wie "WHERE id = N" enthält. Wenn die Datensätze im Cache vorhanden sind, wird die erste Abfrage ausgeführt und die restlichen N Abfragen werden nicht ausgeführt, und die Datensätze werden aus dem Cache abgerufen.

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

Für Liste():

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

Für iterate():

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