Objectif

CriteriaBuilder permet de construire des morceaux de requête

Qu’est-ce que CriteriaBuilder ?

CriteriaBuilder est l’objet principal qui fournit toutes les méthodes nécessaires pour construire :

  • des requêtes (CriteriaQuery)
  • des conditions (Predicate)
  • des expressions (Expression)
  • des fonctions (count, sum, max, etc.)
  • des opérations logiques (and, or, not)
  • des tris (orderBy)

Comment obtenir un CriteriaBuilder

Le CriteriaBuilder est fourni par l’EntityManager.

EntityManager em = ...;
 
CriteriaBuilder cb = em.getCriteriaBuilder();

Quelques méthodes

L’ensemble des méthodes est disponible dans la Javadoc. Ci-dessous nous en présentons quelques une.

MéthodeJavaDoc officielleSignature
equalCrée un prédicat pour tester l’égalité entre deux expressions.Predicate equal(Expression<?> x, Object y)
greaterThanCrée un prédicat pour tester si une expression est strictement supérieure à une autre.<Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> x, Y y)
andCrée une conjonction de prédicats. Un prédicat AND est vrai si tous les prédicats le sont.Predicate and(Predicate... restrictions)
likeCrée un prédicat pour tester si une expression de type chaîne correspond à un motif (LIKE).Predicate like(Expression<String> x, String pattern)

On remarque de type principaux : Expression et Predicate

Comprendre Expression

Une Expression<T> représente une valeur dans une requête.

Cela peut être :

  • un champ (name, age)
  • une fonction (count, sum)
  • un calcul (age + 10)
  • une valeur constante
// accéder à un attribut; root.get("name") retourne une Expression<String>
Expression<String> nameExp = root.get("name");
// fonction SQL COUNT
Expression<Long> countExp = cb.count(root);

Comprendre Predicate

Un Predicate représente une condition logique (WHERE). Il est toujours construit via CriteriaBuilder

  • Predicate equal(Expression<?> x, Object y)
// WHERE name = 'Adrien'
Predicate condition = cb.equal(root.get("name"), "Adrien");
// WHERE age > 18
Predicate condition = cb.greaterThan(root.get("age"), 18);

On peut également combiner plusieurs prédicat via and(Predicate... restrictions)

Predicate p1 = cb.equal(root.get("active"), true);
Predicate p2 = cb.greaterThan(root.get("age"), 18);
 
Predicate andCondition = cb.and(p1, p2);

Exemple complet

Note : pour le moment, nous n’avons pas vu comment construire ni l’objet CriteriaQuery, ni l’objet Root

CriteriaBuilder cb = em.getCriteriaBuilder();  // 1. Créer un objet CriteriaBuilder
CriteriaQuery<User> query = cb.createQuery(User.class);
 
Root<User> root = query.from(User.class);
 
Predicate condition = cb.equal(root.get("name"), "Adrien");  // 2. créer un prédicat 
 
query.select(root).where(condition);  // 3. exploiter un prédicat
 
List<User> results = em.createQuery(query).getResultList();