Découverte du langage HQL Nous savons désormais comment enregistrer une entité JPA dans la base de données. Découvrons maintenant comment manipuler notre objet grâce aux opérations de récupération, modification et suppression. Pour ce faire, nous allons d'abord créer une classe de tests dans laquelle nous testerons successivement ces opérations. La préparation de cette classe nous permettra de découvrir les premiers éléments du langage de requêtage propre à Hibernate, le langage HQL (Hibernate Query Language), que nous approfondirons ensuite dans le chapitre suivant.Le langage HQL possède une syntaxe proche du SQL et permet d'écrire des requêtes dans un langage simplifié et adapté à la manipulation orientée objet. Création de la classe de tests Commençons par créer une nouvelle classe Main, dans laquelle nous effectuerons nos tests successifs. Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL Cette classe sera composée des méthodes suivantes : private static void clean() : vide la table EVENTS entre deux tests, private static void print() : affiche le contenu de la table EVENTS entre deux tests, private static void testCreate() : crée deux objets Event et les enregistre dans la base de données, private static void testRead() : récupère un objet Event à partir de son titre, private static void testUpdate() : récupère un objet Event dans la base de données, le modifie, puis rend persistantes les modifications, private static void testDelete() : supprime un objet Event présent dans la base de données. Enfin, une méthode main() initialise la session Hibernate, puis appelle successivement les méthodes de test. import org.hibernate.Session; public class Main { private static Session s = null; Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL public static void main(String[] args) { // Ouverture d'une session Hibernate s = HibernateUtils.getSession(); // Lancement des tests successifs testCreate(); testRead(); testUpdate(); testDelete(); // Fermeture de la session Hibernate s.close(); } // Création d'un event private static void testCreate() { } // Lecture d'un event Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL private static void testRead() { } // Modification d'un event private static void testUpdate() { } // Suppression d'un event private static void testDelete() { } // Vide la table EVENTS de toutes ses entrées private static void clean() { } // Affiche le contenu de la table EVENTS private static void print() { } } Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL Afficher et vider la table EVENTS Vider la table EVENTS Commençons par la méthode clean() qui vide la table EVENTS de tout son contenu.Comme nous l'avons vu précédemment, une opération effectuant une modification sur les données persistantes commence par l'ouverture d'une transaction et se termine par la fermeture de celle-ci. Entre les deux, nous utiliserons une requête Hibernate (classe org.hibernate.Query), écrite en HQL : "delete Event". import java.util.Calendar; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; // Vide la table EVENTS de toutes ses entrées private static void clean() { System.out.println("--------- Vide la table events : ---------"); // Début de la transaction Transaction tx = s.beginTransaction(); Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL // Création de la requête Query q = s.createQuery("delete Event"); // Exécution de la requête q.executeUpdate(); // Fin de la transaction tx.commit(); } Nous retrouvons bien, lignes 8 et 16, la gestion de la transaction. Le HQL est utilisé ligne 11 pour la suppression de tout le contenu de la table stockant les events. Notons que la table est désignée par le nom de l'entité JPA Event et non par le nom de la table dans la base de données, events. En effet, le HQL est orienté objet et est prévu pour faciliter la transition avec le modèle objet Java. Ligne 13, nous appelons la méthode permettant de lancer l'exécution de la requête. Afficher le contenu de la table EVENTS Afin de vérifier le résultat de chacun de nos tests de façon plus rapide qu'en vérifiant sur PhpMyAdmin, nous allons écrire une méthode affichant le contenu de la table events. import java.util.ArrayList; import java.util.Calendar; Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import fr.mistra.pgejpav1.jpa.Event; // Affiche le contenu de la table EVENTS private static void print() { // Début de la transaction Transaction tx = s.beginTransaction(); // Création de la requête Query q = s.createQuery("from Event"); // Récupération de la liste des résultats ArrayList list = (ArrayList) q.list(); // Affichage des résultats for (Event e: list) { System.out.println("Event : [id] = " + e.getId() + "\t" + "[title] = " + e.getTitle() + "\t" + "[desc] = " + e.getDescription() + "\n" + Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL "[date] = " + e.getBeginDate().getTime().toLocaleString() + "\t" + "[allDay] = " + e.isAllDay()); } // Fin de la transaction tx.commit(); } Là encore, nous ouvrons et fermons une transaction Hibernate en début et fin de méthode. La requête HQL se compose simplement avec "from Event" (ligne 17): la clause SELECT du SQL est sous-entendue. Le résultat, sous forme de java.util.List est obtenu grâce à la méthode list() de la classe Query (ligne 19). Enfin, les lignes 21 à 27 gèrent l'affichage des entrées lues, champ par champ. Test des méthodes de suppression et d'affichage Testons ces deux méthodes à l'aide du code suivant : import org.hibernate.Session; public static void main(String[] args) { // Ouverture d'une session Hibernate s = HibernateUtils.getSession(); Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL // Vide la table EVENTS de ses éventuelles entrées clean(); // Affiche le contenu de la table print(); // Fermeture de la session Hibernate s.close(); } A l'exécution du programme, les habituels logs Hibernate s'affichent dans la console, suivi des traces d'exécution suivantes : --------- Vide la table events : --------Hibernate: delete from events_01 Hibernate: /* from Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL Event */ select event0_.events_id as events1_0_, event0_.events_allDay as events2_0_, event0_.events_beginDate as events3_0_, event0_.events_description as events4_0_, event0_.events_title as events5_0_ from events_01 event0_ Le log Hibernate de la méthode clean() (lignes 3 à 5) montrent que la requête HQL que nous avions écrite s.createQuery("delete Event"); est bien traduite en la requête SQL correspondante, et que le lien entre la classe Event et la table events_01 est bien effectué. De même dans la méthode print() aux lignes 10 à 17 : s.createQuery("from Event") est bien traduit en select from events_01. Notre classe de tests est prête, nous pouvons désormais implémenter les tests des opérations élémentaires de manipulation d'objets. Ces opérations sont souvent appelées opérations CRUD, pour Create - Read - Update - Delete : création, récupération modification et suppression. Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Découverte du langage HQL . Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Powered by TCPDF (www.tcpdf.org)