Det här verkar inte vara ett problem med Hibernate API
, detta är faktiskt det önskade beteendet.
Query.iterate() :
Returnera frågeresultaten som en Iterator
. Om frågan innehåller flera resultat före rad, returneras resultaten i en instans av Object[]
.Entities
returneras när resultaten initieras på begäran. Den första SQL-frågan returnerar identifiers
bara.
Kör 1+N SQL
frågor. Den första frågan returnerar bara identifieraren för alla posterna och när den returnerade iteratorn itereras sedan varje gång en separat SQL-fråga exekveras som innehåller en WHERE-sats som WHERE id=N
. Om posterna finns i cachen exekveras den första frågan och de övriga N frågorna exekveras inte och poster hämtas från cachen.
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
och laddar hela data. Även om posterna finns i cachen exekveras en ny SQL-fråga för att ladda posterna från databasen.
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);
}