Isso não parece ser um problema com a
Hibernate API
, de fato este é o comportamento desejado. Query.iterate() :
Retorne os resultados da consulta como um
Iterator
. Se a consulta contiver vários resultados antes da linha, os resultados serão retornados em uma instância de Object[]
.Entities
retornado à medida que os resultados são inicializados sob demanda. A primeira consulta SQL retorna identifiers
só. Executa
1+N SQL
consultas. A primeira consulta retorna apenas o identificador de todos os registros e quando o iterador retornado é iterado, cada vez que uma consulta SQL separada é executada que contém uma cláusula WHERE como WHERE id=N
. Se os registros estiverem presentes no cache, a primeira consulta será executada e as N consultas restantes não serão executadas e os registros serão obtidos do cache. 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
e carrega todos os dados. Mesmo que os registros estejam presentes no cache, uma nova consulta SQL é executada para carregar os registros do banco de dados. 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);
}