Ressource
Les requêtes Criteria sont un graphe d’objets où chaque partie du graphe représente une portion atomique de la requête. Les différentes étapes de construction de ce graphe se traduisent globalement ainsi :
-
L’interface
CriteriaQuerydéfinit les fonctionnalités nécessaires pour construire une requête de haut niveau.
Le type spécifié pour la requête, par exemplecriteriaQuery<Class<T> resultClass>, correspond au type du résultat retourné.
Si aucun type n’est fourni, le résultat sera de typeObject.
Une requête Criteria contient des méthodes permettant de :- spécifier les éléments retournés dans le résultat,
- restreindre les résultats selon certaines conditions,
- regrouper les résultats,
- définir un ordre de tri,
- et bien plus encore.
-
L’interface
Rootreprésente les entités racines impliquées dans la requête.
Il peut y avoir plusieurs racines définies dans une même requête Criteria. -
L’interface
Pathreprésente le chemin vers un attribut dans l’entité racine.
Elle étend également l’interfaceExpression, qui contient des méthodes retournant desPredicate. -
La méthode
builder.count()est une méthode d’agrégation.
Elle retourne une expression utilisée pour la sélection du résultat.
Lorsque des méthodes d’agrégation sont utilisées comme arguments dans la méthodeselect, le type de la requête doit correspondre au type de retour de la méthode d’agrégation. -
Une instance de
TypedQueryest nécessaire pour exécuter laCriteriaQuery.

Dans le diagramme ci-dessus, observez les classes sur fond bleu. L’arborescence des relations explique la hiérarchie d’héritage entre les différentes interfaces présentes dans l’API Criteria.
Selectionse trouve au sommet et est étendue parExpression.Expressionest à son tour étendue par les interfacesPredicateetPath.FrométantPathqui est à son tour le parent des interfacesRootetJoin.
- L’interface
Rootest également une expression.- Cela signifie que nous pouvons interroger une entité complète en passant
Rootcomme paramètre à la méthodeselect. - Si nous voulons récupérer un attribut sélectionné, nous pouvons récupérer le chemin d’accès à l’attribut à l’aide de
root.get(attributeName). Cette méthode renvoie un objetPathqui hérite deExpression.
- Cela signifie que nous pouvons interroger une entité complète en passant
Exemple complet
Voici un exemple complet, les pages suivantes détaillerons pas à pas la création d’une requêtes
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MaBaseDeTestPU");
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.select(pet);
TypedQuery<Pet> q = em.createQuery(cq);
List<Pet> allPets = q.getResultList();-
Cette requête illustre les étapes de base pour créer une requête Criteria.
-
Utiliser une instance de
EntityManagerpour créer un objetCriteriaBuilder. -
Créer un objet requête en instanciant l’interface
CriteriaQuery.
Les attributs de cet objet requête seront ensuite modifiés avec les détails de la requête. -
Définir la racine de la requête en appelant la méthode
fromsur l’objetCriteriaQuery. -
Spécifier le type du résultat de la requête en appelant la méthode
selectde l’objetCriteriaQuery. -
Préparer la requête pour son exécution en créant une instance de
TypedQuery<T>, en précisant le type du résultat attendu. -
Exécuter la requête en appelant la méthode
getResultListsur l’objetTypedQuery<T>.
Comme cette requête retourne une collection d’entités, le résultat est stocké dans uneList.
C’est l’équivalent de la requête
SELECT * FROM PetL’exemple ci-dessus est simpliste et l’utilisation de la méthode suivante aurait suffi
List<Pet> = em.createQuery("SELECT p FROM Pet p", Pet.class).getResultList();Pourquoi l’utiliser ?
Très bonne remarque ! En effet, jusqu’à présent, les opérations de base sur les entités (persist, merge, remove) ne permettaient pas de contrôler les conditions WHERE lors de leur exécution. Plusieurs solutions sont possibles :
- faire un filtre directement en Java, mais très peu performant
- utiliser JPQL + méthode
createQuery - utiliser l’API Criteria