Ressources
Types dâopĂ©ration
Il nâest possible de rĂ©aliser que trois types dâopĂ©rations avec lâAPI Criteria qui sont la lecture, la modification et la suppression (SELECT, UPDATE et DELETE). Chacune de ces opĂ©rations a ses propres classes qui sont :
CriteriaQuerypour le SELECT.CriteriaUpdatepour lâUPDATE.CriteriaDeletepour le DELETE.
La classe CriteriaBuilder
La classe CriteriaBuilder est le principal point dâentrĂ©e de lâAPI Criteria. Elle fournit des mĂ©thodes pour crĂ©er les Ă©lĂ©ments fondamentaux dâune requĂȘte, notamment :
createQuery(): CrĂ©e une instance de CriteriaQuery pour dĂ©finir la requĂȘte.equal(),greaterThan(),like(), etc. : CrĂ©ent des prĂ©dicats pour filtrer les donnĂ©es.sum(),avg(),max(), etc. : CrĂ©ent des expressions dâagrĂ©gation.
CriteriaBuilder cb = em.getCriteriaBuilder(); // Créer un CriteriaBuilder depuis EntityManager
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); // Utiliser le CB pour crĂ©er une requĂȘteLa classe CriteriaQuery
La classe CriteriaQuery reprĂ©sente la requĂȘte en elle-mĂȘme et permet de dĂ©finir les diffĂ©rents Ă©lĂ©ments constitutifs de la requĂȘte, tels que :
- Définition de la source (
.from()) : elle renvoie un objet Root, qui reprĂ©sente cette entitĂ© dans la requĂȘte et permet dâaccĂ©der aux attributs de celle-ci. - Les sĂ©lections (
.select()) : pour définir les champs à récupérer. - Les filtres (
.where()) : pour appliquer des conditions de filtrage. - Les jointures (
.join()) : pour lier plusieurs entités. - Les tris (
.orderBy()) : pour ordonner les résultats. - Les agrégations (
.groupBy(),.having()) : pour grouper et appliquer des conditions sur les groupes.
Root<Pet> pet = cq.from(Pet.class);
cq.select(pet);Une fois la requĂȘte construite, elle peut ĂȘtre exĂ©cutĂ©e via lâEntityManager.
TypedQuery<Pet> q = em.createQuery(cq);
List<Pet> allPets = q.getResultList(); // permet d'exĂ©cuter la requĂȘteLes expressions de prĂ©dicats
Les expressions de prĂ©dicats sont les Ă©lĂ©ments de base pour dĂ©finir les conditions de filtrage dans une requĂȘte Criteria. Voici quelques exemples dâutilisation :
cb.equal(root.get("name"), "John"): Filtre les entitĂ©s oĂč le champnameest Ă©gal Ă âJohnâ.cb.greaterThan(root.get("age"), 18): Filtre les entitĂ©s oĂč lâageest supĂ©rieur Ă 18.cb.like(root.get("email"), "%@example.com"): Filtre les entitĂ©s dont lâemail se termine par â@example.comâ.cb.isNull(root.get("address")): Filtre les entitĂ©s oĂč lâaddressest null.
Ces prĂ©dicats peuvent ĂȘtre combinĂ©s avec des opĂ©rateurs logiques (and(), or(), not()) pour crĂ©er des conditions de filtrage complexes.
Exemple select
// Créer un objet de type CriteriaQuery
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
// Construire la requĂȘte
Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = pet.join("owner");
cq.select(pet)
.where(
cb.equal(pet.get("type"), "dog"),
cb.lessThan(pet.get("age"), 5),
cb.equal(owner.get("id"), ownerId)
)
.orderBy(cb.asc(pet.get("name")));
// Executer la requĂȘte
TypedQuery<Pet> q = em.createQuery(cq);
List<Pet> filteredPets = q.getResultList();Exemple update
Attention
A toujours exécuter le code dans une transaction
// Start a transaction
em.getTransaction().begin();
// Create CriteriaBuilder and CriteriaUpdate
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Pet> update = cb.createCriteriaUpdate(Pet.class);
// Define the root entity (Pet)
Root<Pet> pet = update.from(Pet.class);
// Join with Owner
Join<Pet, Owner> owner = pet.join("owner");
// Set the update: increase age by 1
update.set(pet.get("age"), cb.sum(pet.get("age"), 1))
.where(
cb.equal(pet.get("type"), "dog"),
cb.lessThan(pet.get("age"), 5),
cb.equal(owner.get("id"), ownerId)
);
// Execute the update
Query query = em.createQuery(update);
int updatedCount = query.executeUpdate();
// Commit transaction
em.getTransaction().commit();