C'est un peu délicat, cela dépend de l'implémentation de JPA 2 que vous utilisez, celle-ci fonctionne pour EclipseLink 2.4.1, mais pas pour Hibernate, voici un compte générique de CriteriaQuery pour EclipseLink :
public static Long count(final EntityManager em, final CriteriaQuery<?> criteria)
{
final CriteriaBuilder builder=em.getCriteriaBuilder();
final CriteriaQuery<Long> countCriteria=builder.createQuery(Long.class);
countCriteria.select(builder.count(criteria.getRoots().iterator().next()));
final Predicate
groupRestriction=criteria.getGroupRestriction(),
fromRestriction=criteria.getRestriction();
if(groupRestriction != null){
countCriteria.having(groupRestriction);
}
if(fromRestriction != null){
countCriteria.where(fromRestriction);
}
countCriteria.groupBy(criteria.getGroupList());
countCriteria.distinct(criteria.isDistinct());
return em.createQuery(countCriteria).getSingleResult();
}
L'autre jour, j'ai migré d'EclipseLink vers Hibernate et j'ai dû changer ma fonction de comptage pour la suivante, alors n'hésitez pas à utiliser l'une ou l'autre car c'est un problème difficile à résoudre, cela peut ne pas fonctionner pour votre cas, c'est utilisé depuis Hibernate 4.x, remarquez que je n'essaie pas de deviner quelle est la racine, au lieu de cela je la passe depuis la requête, donc problème résolu, trop de cas de coin ambigus pour essayer de deviner :
public static <T> long count(EntityManager em,Root<T> root,CriteriaQuery<T> criteria)
{
final CriteriaBuilder builder=em.getCriteriaBuilder();
final CriteriaQuery<Long> countCriteria=builder.createQuery(Long.class);
countCriteria.select(builder.count(root));
for(Root<?> fromRoot : criteria.getRoots()){
countCriteria.getRoots().add(fromRoot);
}
final Predicate whereRestriction=criteria.getRestriction();
if(whereRestriction!=null){
countCriteria.where(whereRestriction);
}
final Predicate groupRestriction=criteria.getGroupRestriction();
if(groupRestriction!=null){
countCriteria.having(groupRestriction);
}
countCriteria.groupBy(criteria.getGroupList());
countCriteria.distinct(criteria.isDistinct());
return em.createQuery(countCriteria).getSingleResult();
}
0 votes
Il serait très utile si quelqu'un peut aider ou inclure dans les réponses ci-dessous. Comment réaliser la requête de comptage suivante en utilisant l'API de critères JPA ? select count(distinct col1, col2, col3) from my_table ;
0 votes
Regarder la réponse ci-dessous mais à la place de qb.count utiliser qb.distinctCount @Bhhavesh