sql >> Databáze >  >> RDS >> Oracle

org.hibernate.Query .iterate() VS .getResultList() generování dotazu

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



  1. Připojení PHP na Linuxu k Microsoft Access na Windows Share

  2. MySQL, vraťte všechny výsledky do X posledních hodin

  3. Tvůrce dotazů Laravel 4 – s komplikovanými levými spoji

  4. Laravel Výmluvná dvojnásobná hodnota uložená v databázi se vrátila zaokrouhlená