Vous êtes sur la page 1sur 18

Hibernate Query Language

2 ISIC – Semestre 3

Pr. Mohamed LACHGAR


M. LACHGAR
12/09/2020 ENSAJ 1
Introduction
Hibernate fournit un langage d'interrogation extrêmement puissant qui
ressemble au SQL. HQL (Hibernate Query Language) est totalement
orienté objet, comprenant des notions d'héritage, de polymorphisme et
d'association.

Ce langage est insensible à la casse, sauf au niveau des noms des objets
Java.

Les éléments que l'ont spécifie font parti de l'objet persistant, et non de la
base de donnée. A aucun moment, on ne spécifie d'élément faisant
partie de la base de donnée (c'est le travail des fichiers de mapping).

Pour bien comprendre Hibernate, il faut raisonner en Objet et pas en terme


de SGBD relationnel.

12/09/2020 ENSAJ 2
La clause from
La clause FROM est utilisée pour charger un/des objets complets persistants
en mémoire.

Voici la syntaxe de la clause FROM:

String hql = "FROM ma.projet.beans.Employee";


Query query = session.createQuery(hql);
List results = query.list();

12/09/2020 ENSAJ 3
La clause AS
 La clause AS peut être utilisé pour assigner des alias à des classes dans vos
requêtes HQL spécialement lorsque vous avez des requêtes longues.
Par exemple :

String hql = "FROM Employee AS E";


Query query = session.createQuery(hql);
List results = query.list();

 Le mot clé AS est optionnel et vous pouvez également spécifier l'alias


directement après le nom de la classe, comme suit:

String hql = "FROM Employee E";


Query query = session.createQuery(hql);
List results = query.list();

12/09/2020 ENSAJ 4
La clause Select
 La clause SELECT permet de mieux contrôler le jeu de résultats de la clause from.
Si vous souhaitez obtenir quelques propriétés d'objets au lieu de l'objet complé,
utilisez la clause SELECT.

Voici la syntaxe d'utilisation de la clause SELECT pour obtenir exactement le


champ prenom de l'objet employé:

String hql = "SELECT E.firstName FROM Employee E";


Query query = session.createQuery(hql);
List results = query.list();

 Il est à noter ici que Employee.firstName est une propriété de l'objet des
employés plutôt que d'un champ de la table EMPLOYEE.

12/09/2020 ENSAJ 5
La clause Where
 Si vous souhaitez afficher les objets spécifiques à une condition, vous
utilisez la clause WHERE.

Voici la syntaxe de la clause WHERE:

String hql = "FROM Employee E WHERE E.id = 10";


Query query = session.createQuery(hql);
List results = query.list();

12/09/2020 ENSAJ 6
La clause Ordre By
 Pour trier les résultats de votre requête HQL, vous aurez besoin d'utiliser la clause
ORDER BY.
Vous pouvez trier les résultats par n'importe quelle propriété sur les objets dans
le jeu de résultats par ordre croissant (ASC) ou décroissant (DESC).
Voici la syntaxe d'utilisation de la clause ORDER BY:
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();

 Si vous vouliez trier par plus d'une propriété, vous devez juste ajouter les
propriétés supplémentaires à la fin de la clause order by, séparés par des virgules,
comme suit:
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
12/09/2020 ENSAJ 7
La clause GROUP BY 
 Cette clause permet de tirer les informations de la base de données et de
les regrouper sur la base d'une valeur d'un attribut et, en général, utiliser
le résultat d'inclure d’une valeur globale.

Voici la syntaxe d'utilisation de la clause GROUP BY:

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +


"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();

12/09/2020 ENSAJ 8
Utilisation des paramètres nommés

Hibernate supporte les paramètres nommés dans ses requêtes HQL.

Cela rend l'écriture de requêtes HQL qui acceptent les entrées de


l'utilisateur facile et vous n'avez pas besoin de se défendre contre les
attaques par injection SQL.

Voici la syntaxe en utilisant des paramètres nommés:

String hql = "FROM Employee E WHERE E.id = :employee_id";


Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();

12/09/2020 ENSAJ 9
La clause UPDATE
 La clause UPDATE permet de mettre à jour une ou plusieurs propriétés
d'un ou plusieurs objets.

Voici la syntaxe d'utilisation la clause UPDATE:

String hql = "UPDATE Employee set salary = :salary " + "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

12/09/2020 ENSAJ 10
La clause DELETE
 La clause DELETE permet de supprimer un ou plusieurs objets.

Voici la syntaxe d'utilisation la clause DELETE:

String hql = "DELETE FROM Employee " +


"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

12/09/2020 ENSAJ 11
La clause INSERT

String hql = "INSERT INTO Employee(firstName, lastName, salary)" +


"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

12/09/2020 ENSAJ 12
Méthodes globales
 HQL supporte une gamme de méthodes globales, similaire à SQL. Ils
fonctionnent de la même manière dans les requêtes HQL comme en SQL
et ci-dessous la liste des fonctions disponibles:

S.N. Fonctions Description


1 avg(property name) La moyenne de la valeur d'une propriété

2 count(property name or *) Le nombre de fois que se produit une propriété


dans les résultats
3 max(property name) La valeur maximale des valeurs de propriété

4 min(property name) La valeur minimale des valeurs de propriété

5 sum(property name) La somme des valeurs des propriétés

12/09/2020 ENSAJ 13
Méthodes globales
 Le mot-clé distinct ne compte que les valeurs uniques dans l'ensemble de
lignes. La requête suivante retourne uniquement compte unique:

String hql = "SELECT count(distinct E.firstName) FROM Employee E";


Query query = session.createQuery(hql);
List results = query.list();

12/09/2020 ENSAJ 14
Pagination à l'aide de requêtes
 Il existe deux méthodes de requête pour la pagination.

S.N. Méthode & Description


1 Query setFirstResult(int startPosition)
Cette méthode prend un entier qui représente la première ligne de votre jeu de
résultats, en commençant par la ligne 0.
2 Query setMaxResults(int maxResult)
Cette méthode indique à Hibernate à récupérer un maxResults nombre fixe
d'objets.

12/09/2020 ENSAJ 15
Pagination à l'aide de requêtes
 En utilisant les deux méthodes ensemble, nous pouvons construire un
composant de pagination dans notre site web ou d'une application
Swing.

Voici l'exemple que vous pouvez étendre à aller chercher 10 lignes à la


fois:

String hql = "FROM Employee";


Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();

12/09/2020 ENSAJ 16
Exemple

session.createQuery("from Film as film where


film.titre like :titre and film.annee < :annee")
.setString ("titre", "%er%")
.setInteger("annee", 2000)
.list();

12/09/2020 ENSAJ 17
Apprendre plus

 https://docs.jboss.org/hibernate/orm/3.5/refe
rence/fr/html/queryhql.html#queryhql-polym
orphism

12/09/2020 ENSAJ 18