JPA EntityManager.getSingleResult()为COUNT查询返回什么?

EntityManager.getSingleResult()为COUNT查询返回什么?

那么.. foo的精确运行时类型是什么?

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

根据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,在应用聚合函数之前都会消除空值。

注意: 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

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

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

(在其他情况下,COUNT生成的Long可能会被包装,但今天不会。)

显然,一个数字是来自查询的计数:)它的类型按规范是Long。

AFAIK COUNT函数返回Long