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.

  1. Brug af klassenavnet i stedet for tabelnavnet.
  2. Brug af klassefeltnavnet i stedet for tabelkolonnenavnet.
  3. 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 Userer navnet på klassen, og userer 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, selectnå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.