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.
- Verwendung des Klassennamens anstelle des Tabellennamens.
- Verwendung des Klassenfeldnamens anstelle des Tabellenspaltennamens.
- 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 User
ist der Name der Klasse und user
der 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, select
wenn 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.
GO TO FULL VERSION