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.

  1. Folosind numele clasei în loc de numele tabelului.
  2. Folosind numele câmpului de clasă în loc de numele coloanei tabelului.
  3. 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 Usereste numele clasei și usereste 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 selectatunci 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.