Oracle
 sql >> Datenbank >  >> RDS >> Oracle

org.hibernate.Query .iterate() VS .getResultList() Abfragegenerierung

Dies scheint kein Problem mit Hibernate API zu sein , tatsächlich ist dies das gewünschte Verhalten.

Query.iterate() :

Gibt die Abfrageergebnisse als Iterator zurück . Wenn die Abfrage mehrere Ergebnisse vor der Zeile enthält, werden die Ergebnisse in einer Instanz von Object[] zurückgegeben .Entities zurückgegeben, wenn die Ergebnisse bei Bedarf initialisiert werden. Die erste SQL-Abfrage gibt identifiers zurück nur.

Führt 1+N SQL aus Abfragen. Die erste Abfrage gibt nur die Kennung 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
}

Query.getResultList() :Executes 1 SQL query und lädt die gesamten Daten. Auch 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);
}