Je vais maintenant vous expliquer une autre solution, qui vous permet d'utiliser la méthode normale de recherche et de pagination sans avoir le problème des éventuels doublons ou des éléments supprimés.
Cette solution a l'avance qu'elle a :
- plus rapide que la solution PK id mentionnée dans cet article
- préserve l'ordre et n'utilise pas la clause "in" sur un éventuel grand ensemble de données de PK
L'article complet peut être consulté sur mon blog
Hibernate offre la possibilité de définir la méthode de récupération des associations non seulement au moment de la conception, mais aussi au moment de l'exécution d'une requête. Ainsi, nous utilisons cette approche en conjonction avec une simple méthode de récupération et nous pouvons également automatiser le processus de changement de l'algorithme de récupération des propriétés de la requête uniquement pour les propriétés de la collection.
Tout d'abord, nous créons une méthode qui résout toutes les propriétés de la collection à partir de la classe d'entité :
public static List<String> resolveCollectionProperties(Class<?> type) {
List<String> ret = new ArrayList<String>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(type);
for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
if (Collection.class.isAssignableFrom(pd.getPropertyType()))
ret.add(pd.getName());
}
} catch (IntrospectionException e) {
e.printStackTrace();
}
return ret;
}
Après avoir fait cela, vous pouvez utiliser cette petite méthode d'aide pour conseiller votre objet de critères afin de changer le FetchMode en SELECT sur cette requête.
Criteria criteria = …
// … add your expression here …
// set fetchmode for every Collection Property to SELECT
for (String property : ReflectUtil.resolveCollectionProperties(YourEntity.class)) {
criteria.setFetchMode(property, org.hibernate.FetchMode.SELECT);
}
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
criteria.list();
Il ne s'agit pas de définir le FetchMode de vos entités au moment de la conception. Ainsi, vous pouvez utiliser les algorithmes normaux de recherche d'association de jointure sur la pagination dans votre interface utilisateur, car la plupart du temps, ce n'est pas la partie critique et il est plus important d'avoir vos résultats aussi rapidement que possible.