1.1 Introducere în HQL
Anterior, v-ați familiarizat cu Hibernate, iar acum vă voi prezenta HQL , alias Hibernate Query Language . De fapt, acesta este SQL convertit pentru scrierea de interogări în Hibernate. Are mai multe diferențe cheie.
- Folosind numele clasei în loc de numele tabelului.
- Folosind numele câmpului de clasă în loc de numele coloanei tabelului.
- Utilizarea opțională a select.
Să-i cerem lui Hibernate să ne returneze toți utilizatorii pe care îi are în baza de date. Iată cum ar arăta această solicitare:
from User
Asta e tot, pentru comparație, prezentăm o interogare similară în SQL:
select * from user
Aici User
este numele clasei și user
este numele tabelului.
Codul Java complet va arăta astfel:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
În caz contrar, HQL este foarte asemănător cu SQL - are și operatori:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Exemplu de lucru cu HQL
Poate că exemplul anterior este puțin confuz din cauza acelorași nume de tabel și câmp. Să venim cu un exemplu special în care acest lucru ar fi mai ușor.
Să presupunem că avem un tabel user_data care conține următoarele câmpuri:
- id INT
- nume de utilizator VARCHAR(100)
- user_level INT
- user_created DATE
Vom crea o clasă Java care se va mapa la acest 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;
}
Acum să scriem câteva exemple:
HQL | SQL |
---|---|
de la Utilizator | selectați * din user_data |
de la Utilizator unde id=3 | selectați * din user_data unde id=3 |
de la utilizator unde nivelul (10,20,30) | selectați * din user_data unde user_level IN (10, 20, 30) |
din Comanda utilizatorului creat de asc | selectați * din ordinea user_data după user_created asc |
de la utilizator unde nume ca „test” | selectați * din user_data unde user_name ca „test” |
Interogările sunt foarte asemănătoare, iar citirea interogărilor HQL atunci când sunteți familiarizat cu numele claselor și câmpurile acestora este la fel de ușoară ca și citirea interogărilor SQL. Poate fi puțin mai dificil de scris, dar, din nou, interogările foarte complexe sunt rareori scrise în HQL.
1.3 Folosind select
În HQL, puteți utiliza select
atunci când tipul de date al rezultatului nu se potrivește cu tipul specificat în from
.
De exemplu, dorim să obținem numele tuturor utilizatorilor care se află în tabelul nostru user_data , apoi trebuie să scriem următoarea interogare:
select name from User
De asemenea, dacă există duplicate printre nume, atunci puteți utiliza operatorul DISTINCT
:
select distinct name from User
Aliasurile funcționează la fel ca în SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Ei bine, complet sub formă de cod Java, această solicitare va arăta astfel:
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();
}
}
Rețineți că interogarea trebuie să returneze o listă de nume. Numele sunt de tip String, deci atât tipul funcției, cât și parametrul de tip al clasei Query sunt de tip String.
GO TO FULL VERSION