2.1 Einführung in die Query-Klassen

Ein weiterer wichtiger Punkt ist übrigens die Query-Hilfsklasse. Sie können es in diesem Beispiel sehen:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

Tatsächlich ist Query eine Schnittstelle und es gibt mehrere Implementierungen für verschiedene Fälle. Aber der Einfachheit halber werde ich es weiterhin eine Klasse nennen. Dies ist, sagen wir, eine Klasse im weitesten Sinne – im Sinne von OOP.

Notiz. Früher gab es zwei Klassen:

  • Abfrage zur Beschreibung der Abfrage.
  • TypedQuery zur Beschreibung einer Abfrage mit einem bekannten Typ.

Das erste erschien, als Hibernate bereits existierte und es noch keine Generika gab. Dann, nach der Veröffentlichung von JDK 5, wurde Hibernate eine weitere Klasse hinzugefügt – TypedQuery, die bereits die Typisierung des Abfrageergebnisses unterstützte.

Aber soweit ich mich erinnere, gab es ab der 5. Version von Hibernate nur noch eine typisierte Klasse, und sie heißt jetzt Query.

Die Standardmethode zum Erstellen einer Abfrage ist:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

Sie haben gelernt, wie man Abfrageobjekte erstellt, aber wie führen Sie diese Abfragen aus?

Hier ist es noch einfacher – wir rufen einfach die list()- Methode für das Query-Objekt auf:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

Die list()- Methode hat ein JPA-Synonym, eine Methode, die dasselbe tut, aber getResultList() heißt . Sie können es manchmal in Code sehen, der von anderen Programmierern geschrieben wurde.

Wenn die Abfrage impliziert, dass das Ergebnis ein einzelnes Ergebnis sein wird, ist es übrigens einfacher, die Methode uniqueResult() zum Aufrufen der Abfrage zu verwenden .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

Die Methode „uniqueResult()“ hat ein JPA-Synonym, die Methode „singleResult()“ . Es wurde aus Gründen der Kompatibilität von Hibernate mit dem JPA-Standard eingeführt. Er macht genau das Gleiche.

2.2 Methoden der Abfrageklasse

Tatsächlich verfügt die Query-Klasse über viele verschiedene Methoden. Im Folgenden werde ich über drei weitere davon sprechen.

Die erste ist die stream() -Methode . Und sein JPA-Synonym getResultStream() .

Beide Methoden geben einen Datenstrom anstelle einer Liste zurück. Dieser Ansatz kann sehr effizient sein, wenn Sie nicht alle als Ergebnis einer Abfrage erhaltenen Objekte auf einmal benötigen. Oder es besteht die Möglichkeit, dass nur der erste von ihnen verwendet wird.

Beispiel:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

Die zweite Methode ist die MethodeexecuteUpdate() . Sie können eine Abfrage schreiben, die etwas in der Datenbank ändert. In diesem Fall ist es erforderlich, dass Hibernate beim Zugriff auf die Datenbank keine schreibgeschützte Transaktion verwendet.

Anfragebeispiel: Wir haben beschlossen, das Level aller Benutzer um 1 zu erhöhen.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

Die MethodeexecuteUpdate () gibt die Anzahl der tatsächlich geänderten Zeilen zurück.

Und schließlich ist die dritte Methode scroll() . Wir werden Ihnen etwas mehr darüber erzählen.

2.3 Scroll-Klassenmethoden

Diese Methode ähnelt in gewisser Weise der stream()- Methode . Nur so können Sie durch die Ergebnisliste navigieren, ohne die Ergebnisse überhaupt herauszuziehen. Das heißt, Sie können eine Abfrage ausführen, sie dann zur millionsten Zeile des Ergebnisses scrollen und von dort aus mit dem Lesen der Daten beginnen.

Solch ein fortgeschrittener Iterator.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

Das ScrollableResults -Objekt verfügt über die folgenden Methoden:

Methode Beschreibung
R get() Gibt das aktuelle Element zurück
nächste() Bewegt den Zeiger zum nächsten Element
vorherige() Bewegt den Zeiger zum vorherigen Element
scroll(int size) Scrollen Sie nach Zeilengröße vorwärts
Position(int pos) Macht die Pos-Nummer des Elements zum aktuellen Element
zuletzt() Das aktuelle Element ist nun das letzte
Erste() Das aktuelle Element ist nun das erste
getRowNumber() Gibt die aktuelle Zeilennummer zurück
setRowNumber() Legt die aktuelle Zeilennummer fest

Nehmen wir an, Sie haben eine Abfrage ausgeführt und möchten das letzte Element abrufen. So geht's:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();