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

org.hibernate.Query .iterate() VS .getResultList() forespørgselsgenerering

Dette ser ikke ud til at være et problem med Hibernate API , faktisk er dette den ønskede adfærd.

Query.iterate() :

Returner forespørgselsresultaterne som en Iterator . Hvis forespørgslen indeholder flere resultater før rækken, returneres resultaterne i en forekomst af Object[] .Entities returneres, efterhånden som resultater initialiseres efter behov. Den første SQL-forespørgsel returnerer identifiers kun.

Udfører 1+N SQL forespørgsler. Den første forespørgsel returnerer kun identifikatoren for alle posterne, og når den returnerede iterator itereres, udføres der hver gang en separat SQL-forespørgsel, der indeholder en WHERE-sætning som WHERE id=N . Hvis posterne er til stede i cachen, udføres den første forespørgsel, og resten N forespørgsler udføres ikke, og poster hentes fra 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 og indlæser alle data. Selvom posterne er til stede i cachen, udføres en ny SQL-forespørgsel for at indlæse posterne fra 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. Liste antallet af duplikerede værdier

  2. Hvordan man forårsager dødvande på MySQL

  3. Linq til SQL ved hjælp af gruppe efter, og rækkefølge efter antal

  4. eliminering af regulære udtryk specialtegn