Nezdá se, že by to byl problém s Hibernate API
, ve skutečnosti jde o požadované chování.
Query.iterate() :
Vraťte výsledky dotazu jako Iterator
. Pokud dotaz obsahuje více výsledků před řádkem, jsou výsledky vráceny v instanci Object[]
.Entities
vrácena jako výsledky jsou inicializovány na vyžádání. První SQL dotaz vrátí identifiers
pouze.
Spustí 1+N SQL
dotazy. První dotaz vrací pouze identifikátor všech záznamů a když je vrácený iterátor iterován, pak pokaždé, když je proveden samostatný SQL dotaz, který obsahuje klauzuli WHERE jako WHERE id=N
. Pokud jsou záznamy v mezipaměti, provede se první dotaz a zbývajících N dotazů se neprovede a záznamy se získají z mezipaměti.
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
a načte všechna data. I když jsou záznamy v mezipaměti, provede se nový SQL dotaz k načtení záznamů z databáze.
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);
}