Ressource

1. Télécharger et lancer le projet

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

  1. Récupérer tous les livres de la base de données avec l’API Criteria.
  2. Récupérer les livres d’un auteur donné. (Paramètre : authorName) VIA API Criteria
  3. Trouver les livres publiés après une année donnée. (Paramètre : year) VIA JPQL
  4. 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.

  1. Créer l’entité Library et adapter Book

— M’appeler

  1. Récupérer toutes les bibliothèques avec leurs livres.
    • Coder une méthode avec l’API Criteria et une autre avec JPQL
  2. Récupérer les livres appartenant à une bibliothèque donnée (libraryName).
  3. 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 SQL
  • getLibrariesWithBooksByAuthor(String authorName) à une seule

Pourquoi ?

  • Commençons par getLibrariesWithBooksByAuthor(String authorName) ou la Root est Library

    • utilise la relation OneToMany vers les Book et que par défaut il y a du FETCH.LAZY aucune requête additionnelle est créée
  • Maintenant si on s’intéresse à getBooksByLibraryName(String libraryName) ou la Root est Book

    • utilise la relation ManyToOne vers la library et que par défaut il y a du FETCH.EAGER donc Hibernate essaie de complètement initialiser l’entité Library

      Hibernate 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

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.

Footnotes

  1. https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/fetching/Fetching.html