Je suis plutôt nouveau dans JPA 2 et c'est l'API CriteriaBuilder / CriteriaQuery:
CriteriaQuery
dans le didacticiel Java EE 6
Je voudrais compter les résultats d'une CriteriaQuery sans les récupérer. Est-ce possible, je n'ai trouvé aucune méthode de ce type, le seul moyen serait de le faire:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
Et cela ne peut pas être la bonne façon de le faire ...
Y a-t-il une solution?
java
jpa-2.0
criteriaquery
Sean Patrick Floyd
la source
la source
Réponses:
Une requête de type
MyEntity
va revenirMyEntity
. Vous voulez une requête pour unLong
.De toute évidence, vous voudrez construire votre expression avec les restrictions et les regroupements, etc. que vous avez ignorés dans l'exemple.
la source
qb.count
est fait sur leRoot<MyEntity>
de votre requête (Root<MyEntity>
myEntity = cq.from (MyEntity.class)) et cela est souvent déjà dans votre code de sélection normal et lorsque vous oubliez, vous vous retrouvez avec une jointure à soi.J'ai trié cela en utilisant le cb.createQuery () (sans le paramètre de type de résultat):
J'espère que ça aide :)
la source
la source
Comme les autres réponses sont correctes, mais trop simples, je présente ci-dessous un extrait de code à exécuter
SELECT COUNT
sur une requête de critères JPA sophistiquée (avec plusieurs jointures, extractions, conditions).Il est légèrement modifié cette réponse .
J'espère que cela fera gagner du temps à quelqu'un.
Parce que l'API IMHO JPA Criteria n'est pas intuitive ni tout à fait lisible.
la source
recursion on databases
? Je parlais de récursivité au niveau de l'API. Ne confondez pas ces concepts :-) JPA est livré avec une API très puissante / complexe qui vous permet de faire plusieurs jointures / récupérations / agrégations / alias, etc. en une seule requête. Vous devez y faire face en comptant.C'est un peu délicat, selon l'implémentation JPA 2 que vous utilisez, celle-ci fonctionne pour EclipseLink 2.4.1, mais pas pour Hibernate, voici un décompte de CriteriaQuery générique pour EclipseLink:
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'un ou l'autre car c'est un problème difficile à résoudre, cela pourrait ne pas fonctionner pour votre cas, il est utilisé depuis Hibernate 4.x, notez que je n'essaie pas de deviner quelle est la racine, je la transmets à partir de la requête, donc le problème est résolu, trop de cas d'angle ambigus à essayer de deviner:
la source
Vous pouvez également utiliser les projections:
la source
Avec Spring Data Jpa, nous pouvons utiliser cette méthode:
la source