Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

org.hibernate.Query .iterate() VS .getResultList() geração de consulta


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);
}