sql >> Base de Datos >  >> RDS >> Oracle

org.hibernate.Query .iterate() VS .getResultList() generación de consultas

Esto no parece ser un problema con Hibernate API , de hecho, este es el comportamiento deseado.

Consulta.iterar() :

Devuelve los resultados de la consulta como un Iterator . Si la consulta contiene varios resultados antes de la fila, los resultados se devuelven en una instancia de Object[] .Entities devuelto a medida que los resultados se inicializan a pedido. La primera consulta SQL devuelve identifiers solo.

Ejecuta 1+N SQL consultas La primera consulta solo devuelve el identificador de todos los registros y cuando se itera el iterador devuelto, cada vez que se ejecuta una consulta SQL separada que contiene una cláusula WHERE como WHERE id=N . Si los registros están presentes en la memoria caché, se ejecuta la primera consulta y las N consultas restantes no se ejecutan y los registros se obtienen de la memoria caché.

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
}

Consulta.getResultList() :Executes 1 SQL query y carga todos los datos. Incluso si los registros están presentes en la memoria caché, se ejecuta una nueva consulta SQL para cargar los registros de la base de datos.

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