Oracle
 sql >> Database >  >> RDS >> Oracle

org.hibernate.Query .iterate() VS .getResultList() generazione di query

Questo non sembra essere un problema con Hibernate API , infatti questo è il comportamento desiderato.

Query.iterate() :

Restituisci i risultati della query come Iterator . Se la query contiene più risultati prima della riga, i risultati vengono restituiti in un'istanza di Object[] .Entities restituiti quando i risultati vengono inizializzati su richiesta. La prima query SQL restituisce identifiers solo.

Esegue 1+N SQL interrogazioni. La prima query restituisce solo l'identificatore di tutti i record e quando l'iteratore restituito viene ripetuto, ogni volta che viene eseguita una query SQL separata che contiene una clausola WHERE come WHERE id=N . Se i record sono presenti nella cache, viene eseguita la prima query e le restanti N query non vengono eseguite e i record vengono ottenuti dalla 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 carica tutti i dati. Anche se i record sono presenti nella cache, viene eseguita una nuova query SQL per caricare i record dal database.

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