
La FAQ HibernateConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 63, dernière mise à jour : 5 juin 2009
Sommaire→Utilisation→Les Criteria- Qu'est ce que Criteria ?
- Comment effectuer une requête avec Criteria ?
- Comment restreindre les résultats de la requête ?
- Comment grouper les restrictions de manière logique ?
- Comment effectuer une recherche à partir d'un exemple ?
- Comment trier les résultats d'une requête ?
- Comment savoir le nombre d'enregistrements retournés par une requête Criteria ?
- Comment limiter le nombre de résultats retournés par une requête Criteria
- Comment récupérer le résultat d'un Criteria dans un Set ?
Criteria est une API de recherche orientée objet. Elle permet de faire des recherches dans la base de données de manière très simple. On peut ajouter des tris, des filtres, ...
HQL a beau être très puissant, beaucoup de développeurs préfèrent avoir une approche plus orientée objet, ils trouvent donc leur bonheur dans Criteria.
Tout d'abord il vous faut une session d'ouverte pour créer la Criteria. Ensuite, Criteria étant une recherche sur une classe donnée, il vous faut connaître le nom de cette classe et finalement, vous pouvez créer la requête :
Criteria criteria = session.createCriteria(Od.class);
Ensuite, pour récupérer les résultats de la recherche, vous pouvez employer la méthode list() qui va vous renvoyer les résultats sous forme d'une liste (List).
List results = criteria.list();
Vous avez maintenant tous vos résultats sous forme d'objet dans votre liste.
Lien : Comment récupérer le résultat d'un Criteria dans un Set ?
Avec Criteria, vous pouvez ajouter des restrictions qui vous permettront de limiter les résultats en fonctions de différents critères.
Pour cela, nous allons ajouter des Criterions, que va nous fournir la classe restriction. Par exemple pour un like :
Criteria criteria = sess.createCriteria(Od.class)
.add(Restrictions.like("description", "Attention%")));
List results = criteria.list();
Vous pouvez employer encore d'autres restrictions, telles que between ou lt (less than).
Lien : Comment grouper les restrictions de manière logique ?
Lien : La classe Restrictions
Vous pouvez aussi regrouper différents critères de manière logique avec les opérateurs ou et et.
Voici un exemple avec un opérateur ou :
Criteria criteria = session.createCriteria(Od.class)
.add(Restrictions.between("weigth", 100,200) )
.add(Restrictions.or(
Restrictions.isNotNull("etiquette"),
Restrictions.isNull("description")
) )
List results = criteria.list();
Une autre possibilité qui nous est donnée par Criteria est de pouvoir effectuer une recherche à partir d'un exemple.
Exemple, vous avez une classe Film avec un réalisateur et une année de sortie et que vous voulez trouver tous les autres films de ce même réalisateur :
Film film = new Film();
film.setRealisateur("Frères Wachowsky");
film.setAnnee(2005);
Example example = Example.create(film)
.excludeProperty("annee") //On ne compare pas avec l'année
.ignoreCase(); //On ne tient pas compte de la casse
Criteria criteria = session.createCriteria(Film.class)
.add(example);
List results = criteria.list();
Vous pouvez trier les résultats d'une requête Criteria par propriété dans l'ordre croissant ou décroissant.
Pour cela, nous allons employer la méthode addOrder sur le Criteria et la classe Order :
Criteria criteria = session.createCriteria(Od.class)
.add(Restrictions.between("weigth", 200, 500))
.addOrder(Order.asc("weigth"))
.addOrder(Order.desc("nom"));
List results = criteria.list();
Vous pouvez ajouter une Projection à votre Criteria :
criteria.setProjection(Projections.rowCount());
Et dire ensuite que vous voulez récupérer un seul résultat :
Integer result = (Integer) criteria.uniqueResult();
Donc pour une requête complète, vous pouvez faire :
Criteria criteria = session.createCriteria(OdPersonne.class);
criteria.setProjection(Projections.rowCount());
Integer result = (Integer) criteria.uniqueResult();
System.out.println("Nombre d'enregistrements : " + result);
Comme pour une requête HQL, il vous suffit d'employer la méthode setMaxResults sur votre Criteria pour que la recherche ne retourne par plus de résultats que voulu.
Criteria crit = session.createCriteria(Od.class);
crit.setMaxResults(10);
Par défaut, cela n'est pas possible, mais il suffit tout simplement de rajouter dans un Set les éléments de la liste renvoyée par le Criteria :
HashSet set = new HashSet();
set.addAll(session.createCriteria(MonOd.class).list());
Ainsi, tous les éléments de votre liste se trouveront exemptes de doublons dans votre Set.


















