1.1 Introduksjon til HQL
Tidligere ble du kjent med Hibernate, og nå vil jeg introdusere deg til HQL , også kjent som Hibernate Query Language . Faktisk er dette SQL-konvertert for å skrive spørringer i Hibernate. Den har flere viktige forskjeller.
- Bruke klassenavnet i stedet for tabellnavnet.
- Bruk av klassefeltnavnet i stedet for tabellkolonnenavnet.
- Valgfri bruk av select.
La oss be Hibernate returnere til oss alle brukerne som den har i databasen. Slik vil forespørselen se ut:
from User
Det er alt, til sammenligning presenterer vi en lignende spørring i SQL:
select * from user
Her User
er navnet på klassen, og user
er navnet på tabellen.
Den komplette Java-koden vil se slik ut:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Ellers er HQL veldig lik SQL - den har også operatører:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Eksempel på arbeid med HQL
Kanskje det forrige eksemplet er litt forvirrende på grunn av de samme tabell- og feltnavnene. La oss komme med et spesielt eksempel hvor dette ville vært enklere.
La oss si at vi har en user_data- tabell som inneholder følgende felt:
- ID INT
- brukernavn VARCHAR(100)
- brukernivå INT
- user_created DATE
Vi vil lage en Java-klasse som vil kartlegge til denne tabellen:
@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;
}
La oss nå skrive noen eksempler:
HQL | SQL |
---|---|
fra bruker | velg * fra brukerdata |
fra bruker der id=3 | velg * fra user_data hvor id=3 |
fra bruker hvor nivå i (10,20,30) | velg * fra brukerdata hvor brukernivå IN (10, 20, 30) |
fra brukerordre etter opprettet asc | velg * fra user_data order by user_created asc |
fra bruker hvor navn som "test" | velg * fra user_data der brukernavn som "test" |
Spørringene er veldig like, og å lese HQL-spørringer når du er kjent med klassenavn og deres felt er like enkelt som å lese SQL-spørringer. Det kan være litt vanskeligere å skrive, men igjen, veldig komplekse spørringer skrives sjelden i HQL.
1.3 Bruk select
I HQL kan du bruke select
når datatypen til resultatet ikke samsvarer med typen spesifisert i from
.
For eksempel, vi ønsker å få navnene på alle brukerne som er i vår user_data- tabell , så må vi skrive følgende spørring:
select name from User
Også, hvis det er duplikater blant navnene, kan du bruke operatoren DISTINCT
:
select distinct name from User
Aliaser fungerer på samme måte som i SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Vel, helt i form av Java-kode, vil denne forespørselen se slik ut:
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();
}
}
Merk at spørringen må returnere en liste med navn. Navn er av typen String, så både typen av funksjonen og typeparameteren til Query-klassen er av typen String.
GO TO FULL VERSION