Requêtes par critères
Hibernate offre une API d'interrogation par critères intuitive et extensible.
Créer une instance de Criteria
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.