Que renvoie EntityManager.getSingleResult()
pour une requête COUNT?
Alors .. quel est le type d'exécution exact de foo?
Object foo = em.createQuery("SELECT COUNT(t) FROM com.company.Thing t WHERE prop = :param")
.setParameter("param", value).getSingleResult();
COUNT (t) renvoie spécifiquement Java.lang.Long. Quand il apparaît seul dans ce contexte, il est renvoyé tel quel.
(Dans d'autres contextes, le long généré par COUNT peut être encapsulé, mais pas aujourd'hui.)
Conformément à la spécification JPA , COUNT renvoie une valeur Long:
4.8.4 Fonctions d'agrégation dans la clause SELECT Résultat d'une requête
peut être le résultat d'une fonction d'agrégat appliquée à une expression de chemin.
Les fonctions d'agrégation suivantes peuvent être utilisées dans la clause SELECT d'une requête : AVG, COUNT, MAX, MIN, SUM.
Pour toutes les fonctions d'agrégation sauf COUNT, l'expression de chemin d'accès qui est l'argument De la fonction d'agrégat Doit se terminer par un champ d'état. L'argument de l'expression de chemin De COUNT peut se terminer par un champ d'état ou d'association , Ou l'argument de COUNT peut être une identification variable.
Les arguments des fonctions SUM et AVG Doivent être numériques. Arguments pour les fonctions MAX et MIN doivent correspondre Aux types de champs d'état pouvant être commandés (c'est-à-dire, types numériques, types de chaîne, types de caractère Ou types de date ).
Le type Java contenu dans le résultat D'une requête utilisant une fonction d'agrégat Est le suivant:
- COUNT renvoie Long.
- MAX, MIN retournent le type du champ d'état auquel ils sont appliqués.
- AVG renvoie Double.
- SUM renvoie Long lorsqu'il est appliqué aux champs d'état de types intégraux (autre que Que BigInteger); Double lorsqu'il est appliqué Aux champs d'état de types à virgule flottante ; BigInteger appliqué à State-fields de type BigInteger; et BigDecimal lorsqu'il est appliqué à champs d'état de type BigDecimal.
Si SUM, AVG, MAX ou MIN est utilisé et que Ne contient aucune valeur à laquelle la fonction d'agrégation Peut être appliquée, le résultat De la fonction d'agrégat est NUL.
Si COUNT est utilisé et qu'il n'y a pas de valeur À appliquer à COUNT, , Le résultat de la fonction d'agrégation Est 0.
L'argument d'une fonction d'agrégation Peut être précédé du mot-clé DISTINCT pour spécifier que les valeurs en double Doivent être éliminées avant que la fonction d'agrégation Ne soit appliquée.
Les valeurs NULL sont éliminées avant l'application de la fonction d'agrégation , , Que le mot clé DISTINCT soit spécifié ou non.
NB: il y a une différence entreJQPLet Native query
Requête requête = em. createQuery ("SELECT COUNT (p) FROM PersonEntity p");
query.getSingleResult (). getClass (). getCanonicalName () -> Java.lang.Long
Requête requête = em. createNativeQuery ("SELECT COUNT (*) FROM PERSON");
query.getSingleResult (). getClass (). getCanonicalName () -> Java.math.BigInteger
Les requêtes natives peuvent renvoyer différents objets pour un COUNT en fonction du pilote de base de données. Cependant, tous ces objets étendent Java.lang.Number, qui implémente la méthode longValue ().
Évidemment, un nombre qui correspond au nombre de la requête :) Son type par spécification est Long.
La fonction AFAIK COUNT renvoie Long
Vous pouvez retourner directement entier, plutôt que long.
return query.getSingleResult() != null ? Integer.parseInt(query.getSingleResult().toString()) : 0;