1.1 Introduction à HQL

Auparavant, vous vous êtes familiarisé avec Hibernate, et maintenant je vais vous présenter HQL , alias Hibernate Query Language . En fait, il s'agit de SQL converti pour écrire des requêtes dans Hibernate. Il présente plusieurs différences essentielles.

  1. Utilisation du nom de la classe au lieu du nom de la table.
  2. Utilisation du nom de champ de classe au lieu du nom de colonne de table.
  3. Utilisation facultative de select.

Demandons à Hibernate de nous renvoyer tous les utilisateurs qu'il a dans la base de données. Voici à quoi ressemblerait cette demande :

from User

C'est tout, à titre de comparaison, nous vous présentons une requête similaire en SQL :

select * from user

Voici Userle nom de la classe, et userest le nom de la table.

Le code Java complet ressemblera à ceci :


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Sinon, HQL est très similaire à SQL - il a aussi des opérateurs :

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Exemple de travail avec HQL

Peut-être que l'exemple précédent est un peu déroutant en raison des mêmes noms de table et de champ. Prenons un exemple spécial où ce serait plus facile.

Supposons que nous ayons une table user_data contenant les champs suivants :

  • identifiant INT
  • nom d'utilisateur VARCHAR(100)
  • user_level INT
  • utilisateur_créé DATE

Nous allons créer une classe Java qui mappera sur cette table :


@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;
}

Écrivons maintenant quelques exemples :

HQL SQL
de l'utilisateur sélectionnez * à partir des données_utilisateur
de l'utilisateur où id=3 select * from user_data où id=3
de l'utilisateur où niveau dans (10,20,30) select * from user_data where user_level IN (10, 20, 30)
à partir de la commande de l'utilisateur par créé asc sélectionnez * à partir de l'ordre user_data par user_created asc
de l'utilisateur où le nom est comme 'test' select * from user_data où user_name like 'test'

Les requêtes sont très similaires, et la lecture des requêtes HQL lorsque vous connaissez les noms de classe et leurs champs est aussi simple que la lecture des requêtes SQL. C'est peut-être un peu plus difficile à écrire, mais encore une fois, les requêtes très complexes sont rarement écrites en HQL.

1.3 Utilisation de la sélection

Dans HQL, vous pouvez utiliser selectlorsque le type de données du résultat ne correspond pas au type spécifié dans from.

Par exemple, nous voulons obtenir les noms de tous les utilisateurs qui sont dans notre table user_data , alors nous devons écrire la requête suivante :

select name from User

Aussi, s'il y a des doublons parmi les noms, alors vous pouvez utiliser l'opérateur DISTINCT:

select distinct name from User

Les alias fonctionnent de la même manière qu'en SQL :

select distinct u.name from User u where u.created > '2020-01-01'

Eh bien, entièrement sous forme de code Java, cette requête ressemblera à ceci :

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();
    }
}

Notez que la requête doit renvoyer une liste de noms. Les noms sont de type String, donc le type de la fonction et le paramètre de type de la classe Query sont de type String.