1.1 Einführung in HQL

Zuvor haben Sie Hibernate kennengelernt, und jetzt werde ich Ihnen HQL , auch bekannt als Hibernate Query Language, vorstellen . Tatsächlich handelt es sich dabei um SQL, das zum Schreiben von Abfragen im Ruhezustand konvertiert wurde. Es gibt mehrere wesentliche Unterschiede.

  1. Verwendung des Klassennamens anstelle des Tabellennamens.
  2. Verwendung des Klassenfeldnamens anstelle des Tabellenspaltennamens.
  3. Optionale Verwendung von select.

Bitten wir Hibernate, uns alle Benutzer zurückzugeben, die es in der Datenbank hat. So würde diese Anfrage aussehen:

from User

Das ist alles, zum Vergleich präsentieren wir eine ähnliche Abfrage in SQL:

select * from user

Hier Userist der Name der Klasse und userder Name der Tabelle.

Der vollständige Java-Code sieht folgendermaßen aus:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Ansonsten ist HQL SQL sehr ähnlich – es verfügt auch über Operatoren:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Beispiel für die Arbeit mit HQL

Möglicherweise ist das vorherige Beispiel aufgrund der gleichen Tabellen- und Feldnamen etwas verwirrend. Lassen Sie uns ein spezielles Beispiel finden, bei dem dies einfacher wäre.

Nehmen wir an, wir haben eine user_data- Tabelle , die die folgenden Felder enthält:

  • id INT
  • Benutzername VARCHAR(100)
  • user_level INT
  • user_created DATUM

Wir erstellen eine Java-Klasse, die dieser Tabelle zugeordnet wird:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

Schreiben wir nun einige Beispiele:

HQL SQL
vom Benutzer Wählen Sie * aus Benutzerdaten aus
von Benutzer mit ID=3 Wählen Sie * aus user_data aus, wobei id=3 ist
von Benutzer mit Level in (10,20,30) Wählen Sie * aus Benutzerdaten aus, wobei Benutzerebene IN (10, 20, 30) ist.
von Benutzerreihenfolge nach erstellt aufsteigend Wählen Sie * aus user_data order by user_created asc
von Benutzer mit Namen wie „test“ Wählen Sie * aus Benutzerdaten aus, wobei Benutzername wie „Test“ ist.

Die Abfragen sind sehr ähnlich und das Lesen von HQL-Abfragen ist genauso einfach wie das Lesen von SQL-Abfragen, wenn Sie mit Klassennamen und ihren Feldern vertraut sind. Das Schreiben ist vielleicht etwas schwieriger, aber andererseits werden sehr komplexe Abfragen selten in HQL geschrieben.

1.3 Verwenden von select

In HQL können Sie es verwenden, selectwenn der Datentyp des Ergebnisses nicht mit dem in angegebenen Typ übereinstimmt from.

Wenn wir beispielsweise die Namen aller Benutzer erhalten möchten, die sich in unserer Tabelle „user_data“ befinden , müssen wir die folgende Abfrage schreiben:

select name from User

Wenn es Duplikate zwischen den Namen gibt, können Sie außerdem den Operator verwenden DISTINCT:

select distinct name from User

Aliase funktionieren genauso wie in SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Nun, komplett in Form von Java-Code sieht diese Anfrage so aus:

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Beachten Sie, dass die Abfrage eine Liste von Namen zurückgeben muss. Namen sind vom Typ String, daher sind sowohl der Typ der Funktion als auch der Typparameter der Query-Klasse vom Typ String.