web-dev-qa-db-fra.com

Que retourne JPA EntityManager.getSingleResult () pour une requête COUNT?

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();
25
Simon Gibbs

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.)

2
Simon Gibbs

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.

41
Pascal Thivent

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

13
lgu

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 ().

9
user6645244

Évidemment, un nombre qui correspond au nombre de la requête :) Son type par spécification est Long.

1
Petar Minchev

La fonction AFAIK COUNT renvoie Long

1
Bogdan

Vous pouvez retourner directement entier, plutôt que long.

return query.getSingleResult() != null ? Integer.parseInt(query.getSingleResult().toString()) : 0;
0
Tiago Moura