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,在应用聚合函数之前都会消除空值。
注意: JQPL和Native查询之间存在差异
查询查询= 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