Dit lijkt geen probleem te zijn met Hibernate API
, eigenlijk is dit het gewenste gedrag.
Query.iterate() :
Retourneer de queryresultaten als een Iterator
. Als de query meerdere resultaten voor de rij bevat, worden de resultaten geretourneerd in een instantie van Object[]
.Entities
geretourneerd omdat de resultaten op aanvraag worden geïnitialiseerd. De eerste SQL-query retourneert identifiers
alleen.
Voert 1+N SQL
uit vragen. De eerste query retourneert alleen de identifier van alle records en wanneer de geretourneerde iterator wordt herhaald, wordt elke keer dat een afzonderlijke SQL-query wordt uitgevoerd die een WHERE-clausule bevat, zoals WHERE id=N
. Als de records in de cache aanwezig zijn, wordt de eerste query uitgevoerd en worden de overige N query's niet uitgevoerd en worden records uit de cache gehaald.
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
en laadt de volledige gegevens. Zelfs als de records in de cache aanwezig zijn, wordt een nieuwe SQL-query uitgevoerd om de records uit de database te 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);
}