Това не изглежда да е проблем с Hibernate API
, всъщност това е желаното поведение.
Query.iterate() :
Връща резултатите от заявката като Iterator
. Ако заявката съдържа множество резултати преди ред, резултатите се връщат в екземпляр на Object[]
.Entities
връща се, когато резултатите се инициализират при поискване. Първата SQL заявка връща identifiers
само.
Изпълнява 1+N SQL
заявки. Първата заявка връща само идентификатора на всички записи и когато върнатият итератор се повтаря, всеки път, когато се изпълнява отделна SQL заявка, която съдържа клауза WHERE като WHERE id=N
. Ако записите присъстват в кеша, тогава първата заявка се изпълнява, а останалите N заявки не се изпълняват и записите се получават от кеша.
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
и зарежда всички данни. Дори ако записите присъстват в кеша, се изпълнява нова SQL заявка за зареждане на записите от базата данни.
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);
}