Qu'est-ce que JPA EntityManager.getSingleResult() de retour pour un nombre de requête?

Que EntityManager.getSingleResult() retour pour un nombre de requête?

.. Quel est le type d'exécution précis de foo?

Object foo = em.createQuery("SELECT COUNT(t) FROM com.company.Thing t WHERE prop = :param")
       .setParameter("param", value).getSingleResult();
24
demandé sur Pascal Thivent 2010-08-26 14:04:27
la source

6 ответов

selon la spécification JPA, COUNT renvoie un Long:

4.8.4 fonctions agrégées dans la Clause SELECT le résultat d'une requête

peut-être le résultat d'un agrégat fonction appliquée à une expression path.

les fonctions agrégées suivantes peuvent être utilisé dans la clause SELECT d'un requête: AVG, COUNT, MAX, MIN, SUM.

pour toutes les fonctions agrégées sauf COUNT, l'expression de chemin qui est argument la fonction d'agrégation doit se terminer dans un état-champ. Le argument d'expression de chemin à compter mai se termine soit dans un domaine d'état ou un association-domaine, ou l'argument de Le comptage peut être une identification variable.

Arguments aux fonctions SUM ET AVG doit être numérique. Les Arguments de la les fonctions MAX ET MIN doivent correspondre pour les types d'États-champs ordonnables (c.-à-d., types numériques, types de chaîne, caractère types, ou types de date).

le Le type Java qui est contenu dans le résultat d'une requête utilisant un agrégat la fonction est comme suit:

  • COUNT returns Long.
  • MAX, MIN retourner le type du champ d'État auquel ils s'appliquent.
  • Moy retourne Double.
  • les retours de Somme sont longs lorsqu'ils sont appliqués aux champs d'état des types intégraux (autres que BigInteger); Double lors de l'application l'état des champs de virgule flottante types; BigInteger quand appliquée à état-champs de type BigInteger; et Bigdécimal lorsqu'il est appliqué à état-champs de type BigDecimal.

si somme, AVG, MAX, ou MIN est utilisé, et il n'existe pas de valeurs à laquelle les la fonction agrégée peut être appliquée, résultat de la fonction d'agrégation est NULL.

si le compte est utilisé, et il n'y a pas valeurs auxquelles le compte peut être appliqué, le résultat de la fonction d'agrégation c'est 0.

l'argument à un agrégat fonction peut être précédé par le mot-clé DISTINCT pour spécifier que dupliquer les valeurs doivent être éliminées avant la fonction d'agrégation.

les valeurs nulles sont éliminées avant la fonction d'agrégation, peu importe si le mot-clé DISTINCT is specified.

39
répondu Pascal Thivent 2010-08-26 15:01:13
la source

NB : il y a une différence entre JQPL et Maternelle requête

Query query = em. createQuery("SELECT COUNT( p) FROM PersonEntity p");

requête.getSingleResult ().getClass ().getCanonicalName ()--> java.lang.Long

Query query = em. createNativeQuery("SELECT COUNT (*) FROM PERSON");

requête.getSingleResult ().getClass ().getCanonicalName () --> java.mathématique.BigInteger!--2-->

12
répondu lgu 2015-11-23 18:31:31
la source

les requêtes natives peuvent renvoyer différents objets pour un compte basé sur le pilote de la base de données; cependant, tous ces objets étendent java.lang.Nombre, qui implémente la méthode longValue ().

9
répondu user6645244 2016-07-27 17:13:05
la source

COUNT (t) retourne spécifiquement java.lang.Long. Lorsqu'il apparaît seul dans ce contexte, il est retourné tel quel.

(dans d'autres contextes le long généré par le compte peut être enveloppé, mais pas aujourd'hui.)

2
répondu Simon Gibbs 2010-08-26 15:38:03
la source

évidemment, un nombre qui est le nombre de la requête:) son type par spécification est Long.

1
répondu Petar Minchev 2010-08-26 15:24:26
la source

AFAIK COUNT function returns Long

1
répondu Bogdan 2010-08-26 15:29:24
la source

Autres questions sur