sql >> Databasteknik >  >> RDS >> Oracle

org.hibernate.Query .iterate() VS .getResultList() frågegenerering

Det här verkar inte vara ett problem med Hibernate API , detta är faktiskt det önskade beteendet.

Query.iterate() :

Returnera frågeresultaten som en Iterator . Om frågan innehåller flera resultat före rad, returneras resultaten i en instans av Object[] .Entities returneras när resultaten initieras på begäran. Den första SQL-frågan returnerar identifiers bara.

Kör 1+N SQL frågor. Den första frågan returnerar bara identifieraren för alla posterna och när den returnerade iteratorn itereras sedan varje gång en separat SQL-fråga exekveras som innehåller en WHERE-sats som WHERE id=N . Om posterna finns i cachen exekveras den första frågan och de övriga N frågorna exekveras inte och poster hämtas från cachen.

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 och laddar hela data. Även om posterna finns i cachen exekveras en ny SQL-fråga för att ladda posterna från databasen.

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. 5 sätt att lista tillfälliga tabeller med T-SQL

  2. Hur kan jag importera en stor (14 GB) MySQL-dumpfil till en ny MySQL-databas?

  3. Infoga NULL i en PostgreSQL DB via PHP när ett datumfält är tomt

  4. MySQL - Perl:Hur man får en rad postnummer inom inlämnade x miles från inlämnat postnummer i Perl-exempel