What does JPA EntityManager.getSingleResult() return for a COUNT query?

Sim*_*bbs 29 java orm jpa

What does EntityManager.getSingleResult() return for a COUNT query?

So.. what is the precise runtime type of foo?

Object foo = em.createQuery("SELECT COUNT(t) FROM com.company.Thing t WHERE prop = :param")
       .setParameter("param", value).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 42

根据JPA规范,COUNT返回Long:

4.8.4 SELECT子句中的聚合函数查询的结果

可能是应用于路径表达式的聚合函数的结果.

可以在查询的SELECT子句中使用以下聚合函数:AVG,COUNT,MAX,MIN,SUM.

对于除COUNT之外的所有聚合函数,作为聚合函数的参数的路径表达式必须在状态字段中终止.COUNT的路径表达式参数可以在state-field或association-field中终止,或者COUNT的参数可以是标识变量.

SUM和AVG函数的参数必须是数字.函数MAX和MIN的参数必须对应于可订购的状态字段类型(即数字类型,字符串类型,字符类型或日期类型).

使用聚合函数的查询结果中包含的Java类型如下:

  • COUNT返回Long.
  • MAX,MIN返回它们所应用的状态字段的类型.
  • AVG返回Double.
  • 当应用于整数类型的状态字段(BigInteger除外)时,SUM返回Long; 应用于浮点类型的状态字段时为Double; 应用于BigInteger类型的状态字段时的BigInteger; 和BigDecimal应用于BigDecimal类型的状态字段.

如果使用SUM,AVG,MAX或MIN,并且没有可以应用聚合函数的值,则聚合函数的结果为NULL.

如果使用COUNT,并且没有可以应用COUNT的值,则聚合函数的结果为0.

聚合函数的参数可以在关键字DISTINCT之后,以指定在应用聚合函数之前消除重复值.

无论是否指定了关键字DISTINCT,在应用聚合函数之前都会消除空值.

  • 当我们使用本机查询时,此方法返回BigInteger而不是Long.任何人都可以解释这种行为吗? (7认同)

lgu*_*lgu 15

注意:JQPLNative查询之间存在差异

查询查询= em.createQuery("SELECT COUNT(p)FROM PersonEntity p");

query.getSingleResult().getClass().getCanonicalName() - > java.lang.Long

查询查询= em.createNativeQuery("SELECT COUNT(*)FROM PERSON");

query.getSingleResult().getClass().getCanonicalName() - > java.math.BigInteger


小智 13

本机查询可以根据数据库驱动程序返回COUNT的不同对象; 但是,所有这些对象都扩展了java.lang.Number,它实现了longValue()方法.


Sim*_*bbs 2

COUNT(t) 具体返回 java.lang.Long。当它在此上下文中单独出现时,它会按原样返回。

(在其他情况下,COUNT 生成的 Long 可能会被换行,但现在不是。)