1.1 Introduktion til HQL
Tidligere har du stiftet bekendtskab med Hibernate, og nu vil jeg introducere dig til HQL , også kendt som Hibernate Query Language . Faktisk er dette SQL-konverteret til at skrive forespørgsler i Hibernate. Det har flere vigtige forskelle.
- Brug af klassenavnet i stedet for tabelnavnet.
- Brug af klassefeltnavnet i stedet for tabelkolonnenavnet.
- Valgfri brug af select.
Lad os bede Hibernate om at returnere alle de brugere, den har i databasen. Sådan ser anmodningen ud:
from User
Det er alt, til sammenligning præsenterer vi en lignende forespørgsel i SQL:
select * from user
Her User
er navnet på klassen, og user
er navnet på tabellen.
Den komplette Java-kode vil se sådan ud:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Ellers ligner HQL meget SQL - den har også operatorer:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Eksempel på arbejde med HQL
Måske er det forrige eksempel lidt forvirrende på grund af de samme tabel- og feltnavne. Lad os komme med et særligt eksempel, hvor dette ville være lettere.
Lad os sige, at vi har en user_data- tabel , der indeholder følgende felter:
- id INT
- brugernavn VARCHAR(100)
- brugerniveau INT
- bruger_oprettet DATE
Vi vil oprette en Java-klasse, der vil knyttes til denne tabel:
@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;
}
Lad os nu skrive nogle eksempler:
HQL | SQL |
---|---|
fra bruger | vælg * fra user_data |
fra bruger hvor id=3 | vælg * fra user_data hvor id=3 |
fra bruger hvor niveau i (10,20,30) | vælg * fra user_data hvor user_level IN (10, 20, 30) |
fra Brugerordre ved oprettet asc | vælg * fra bruger_data-rækkefølgen efter user_created asc |
fra bruger hvor navn som 'test' | vælg * fra user_data hvor brugernavn som 'test' |
Forespørgslerne er meget ens, og at læse HQL-forespørgsler, når du er fortrolig med klassenavne og deres felter, er lige så let som at læse SQL-forespørgsler. Det kan være lidt sværere at skrive, men så igen, meget komplekse forespørgsler er sjældent skrevet i HQL.
1.3 Brug vælg
I HQL kan du bruge, select
når datatypen for resultatet ikke matcher typen angivet i from
.
For eksempel ønsker vi at få navnene på alle brugere, der er i vores user_data- tabel , så skal vi skrive følgende forespørgsel:
select name from User
Hvis der er dubletter blandt navnene, kan du også bruge operatoren DISTINCT
:
select distinct name from User
Aliaser fungerer på samme måde som i SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Nå, helt i form af Java-kode, vil denne anmodning se sådan ud:
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();
}
}
Bemærk, at forespørgslen skal returnere en liste med navne. Navne er af typen String, så både typen af funktionen og typeparameteren for Query-klassen er af typen String.
GO TO FULL VERSION