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
}
so was über die Criteria.iterator() ?, warum isn Ist es da? –
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. –
Danke für die informative Antwort. –