Requêtes par critères Hibernate offre une API d'interrogation par critères intuitive et extensible. Créer une instance de <literal>Criteria</literal> L'interface net.sf.hibernate.Criteria représente une requête sur une classe persistente donnée. La Session fournit les instances de Criteria. Restriction du résultat Un criterion (critère de recherche) est une instance de l'interface org.hibernate.criterion.Criterion. La classe org.hibernate.criterion.Restrictions définit des méthodes pour obtenir des types de Criterion pré-définis. Les restrictions peuvent être goupées de manière logique. Il y a plusieurs types de criterion pré-définis (sous classes de Restriction), mais l'une d'entre elle particulièrement utile vous permet de spécifier directement du SQL. La zone {alias} sera remplacée par l'alias de colonne de l'entité que l'on souhaite intérroger. Une autre approche pour obtenir un criterion est de le récupérer d'une instance de Property. Vous pouvez créer une Property en appelant Property.forName(). Trier les résultats Vous pouvez trier les résultats en utilisant org.hibernate.criterion.Order. Associations Vous pouvez facilement spécifier des contraintes sur des entités liées, par des associations en utilisant createCriteria(). Notez que la seconde createCriteria() retourne une nouvelle instance de Criteria, qui se rapporte aux éléments de la collection kittens. La forme alternative suivante est utile dans certains cas. (createAlias() ne crée pas de nouvelle instance de Criteria.) Notez que les collections kittens contenues dans les instances de Cat retournées par les deux précédentes requêtes ne sont pas pré-filtrées par les critères ! Si vous souhaitez récupérer uniquement les kittens qui correspondent à la criteria, vous devez utiliser ResultTransformer. Peuplement d'associations de manière dynamique Vous pouvez spéficier au moment de l'exécution le peuplement d'une association en utilisant setFetchMode() (c'est-à-dire le chargement de celle-ci). Cela permet de surcharger les valeurs "lazy" et "outer-join" du mapping. Cette requête recherchera mate et kittens via les jointures externes. Voir pour plus d'informations. Requêtes par l'exemple La classe org.hibernate.criterion.Example vous permet de construire un critère suivant une instance d'objet donnée. Les propriétés de type version, identifiant et association sont ignorées. Par défaut, les valeurs null sont exclues. Vous pouvez ajuster la stratégie d'utilisation de valeurs de l'Exemple. Vous pouvez utiliser les "exemples" pour des critères sur les objets associés. Projections, agrégation et regroupement La classe org.hibernate.criterion.Projections est une fabrique d'instances de Projection. Nous appliquons une projection sur une requête en appelant setProjection(). Il n'y a pas besoin de "group by" explicite dans une requête par critère. Certains types de projection sont définis pour être des projections de regroupement, lesquels apparaissent aussi dans la clause group by SQL. Un alias peut optionnellement être assigné à une projection, ainsi la valeur projetée peut être référencée dans des restrictions ou des tris. Voici deux façons différentes de faire ça : Les méthodes alias() et as() enveloppe simplement une instance de projection dans une autre instance (aliasée) de Projection. Comme un raccourci, vous pouvez assignez un alias lorsque vous ajoutez la projection à la liste de projections : Vous pouvez aussi utiliser Property.forName() pour formuler des projections : Requêtes et sous-requêtes détachées La classe DetachedCriteria vous laisse créer une requête en dehors de la portée de la session, et puis l'exécuter plus tard en utilisant n'importe quelle Session arbitraire. Une DetachedCriteria peut aussi être utilisée pour exprimer une sous-requête. Des instances de criterion impliquant des sous-requêtes peuvent être obtenues via Subqueries ou Property. Même des requêtes corrélées sont possibles : Requêtes par identifiant naturel Pour la plupart des requêtes, incluant les requêtes par critère, le cache de requêtes n'est pas très efficace, parce que l'invalidation du cache de requêtes arrive trop souvent. Cependant, il y a une sorte spéciale de requête où nous pouvons optimiser l'algorithme d'invalidation du cache : les recherches sur une clef naturelle constante. Dans certaines applications, cette sorte de requête se produit fréquemment. L'API de critère fournit une provision spéciale pour ce cas d'utilisation. D'abord vous devriez mapper la clef naturelle de votre entité en utilisant <natural-id>, et activer l'utilisation du cache de second niveau. ]]> Notez que cette fonctionnalité n'est pas prévue pour l'utilisation avec des entités avec des clefs naturelles mutables. Ensuite, activez le cache de requête d'Hibernate. Maintenant Restrictions.naturalId() nous permet de rendre l'utilisation de l'algorithme de cache plus efficace.