Ressource
1. Télécharger et lancer le projet
- Lancer Docker Desktop
- Télécharger et importer le projet Maven dans Eclipse
Lancer l’image docker présente dans le Dockerfile : docker compose up
2. Consignes
Objectif
Apprendre à utiliser l’API Criteria, toujours utiliser l’API Criteria sauf si explicitement demandé d’utiliser du JPQL
Partie 1 - Implémenter les requêtes suivantes
- Récupérer tous les livres de la base de données avec l’API Criteria.
- Récupérer les livres d’un auteur donné. (Paramètre : authorName) VIA API Criteria
- Trouver les livres publiés après une année donnée. (Paramètre : year) VIA JPQL
- Trouver les livres dont le prix est compris dans une certaine fourchette. (Paramètres : minPrice, maxPrice)
— M’appeler
Partie 2 - Ajouter une Bibliothèque
Nous avons maintenant une entité Library qui représente une bibliothèque. Une bibliothèque peut contenir plusieurs livres (relation One-To-Many). L’objectif est d’écrire des requêtes JPA utilisant l’API Criteria pour récupérer les données en tenant compte des relations.
- Créer l’entité
Libraryet adapterBook
— M’appeler
- Récupérer toutes les bibliothèques avec leurs livres.
- Coder une méthode avec l’API Criteria et une autre avec JPQL
- Récupérer les livres appartenant à une bibliothèque donnée (libraryName).
- Trouver les bibliothèques qui possèdent au moins un livre d’un auteur donné (authorName).
— M’appeler
Complément
Pour les questions 3. et 4. de la partie 2 nous pouvons remarquer la chose suivante
getBooksByLibraryName(String libraryName)va conduire à deux requêtes SQLgetLibrariesWithBooksByAuthor(String authorName)à une seule
Pourquoi ?
-
Commençons par
getLibrariesWithBooksByAuthor(String authorName)ou la Root estLibrary- utilise la relation
OneToManyvers les Book et que par défaut il y a duFETCH.LAZYaucune requête additionnelle est créée
- utilise la relation
-
Maintenant si on s’intéresse à
getBooksByLibraryName(String libraryName)ou la Root estBook- utilise la relation
ManyToOnevers la library et que par défaut il y a duFETCH.EAGERdonc Hibernate essaie de complètement initialiser l’entité LibraryHibernate uses a secondary select instead. This is because the entity query fetch policy cannot be overridden, so Hibernate requires a secondary select to ensure that the EAGER association is fetched prior to returning the result to the user. 1
- utilise la relation
Corriger !
Corriger getBooksByLibraryName(String libraryName) pour n’avoir qu’une seule requête, sachant que l’objectif n’est pas de mettre ManyToOne en FETCH.EAGER.
- Piste : regarder la différence entre un JOIN et un FETCH JOIN (https://stackoverflow.com/a/17439679/9399016)