Dette ser ikke ud til at være et problem med Hibernate API
, faktisk er dette den ønskede adfærd.
Query.iterate() :
Returner forespørgselsresultaterne som en Iterator
. Hvis forespørgslen indeholder flere resultater før rækken, returneres resultaterne i en forekomst af Object[]
.Entities
returneres, efterhånden som resultater initialiseres efter behov. Den første SQL-forespørgsel returnerer identifiers
kun.
Udfører 1+N SQL
forespørgsler. Den første forespørgsel returnerer kun identifikatoren for alle posterne, og når den returnerede iterator itereres, udføres der hver gang en separat SQL-forespørgsel, der indeholder en WHERE-sætning som WHERE id=N
. Hvis posterne er til stede i cachen, udføres den første forespørgsel, og resten N forespørgsler udføres ikke, og poster hentes fra 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
og indlæser alle data. Selvom posterne er til stede i cachen, udføres en ny SQL-forespørgsel for at indlæse posterne fra 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);
}