Cela ne semble pas être un problème avec Hibernate API
, en fait c'est le comportement souhaité.
Query.iterate() :
Renvoie les résultats de la requête sous la forme d'un Iterator
. Si la requête contient plusieurs résultats avant la ligne, les résultats sont renvoyés dans une instance de Object[]
.Entities
renvoyés au fur et à mesure que les résultats sont initialisés à la demande. La première requête SQL renvoie des identifiers
uniquement.
Exécute 1+N SQL
requêtes. La première requête ne renvoie que l'identifiant de tous les enregistrements et lorsque l'itérateur renvoyé est itéré, chaque fois qu'une requête SQL distincte est exécutée contenant une clause WHERE telle que WHERE id=N
. Si les enregistrements sont présents dans le cache, la première requête est exécutée et les N requêtes restantes ne sont pas exécutées et les enregistrements sont obtenus à partir du 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
et charge toutes les données. Même si les enregistrements sont présents dans le cache, une nouvelle requête SQL est exécutée pour charger les enregistrements de la base de données.
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);
}