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

2022-09-01 06:25:58

COUNT 查询的返回值是多少?EntityManager.getSingleResult()

所以。。foo的确切运行时类型是什么?

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

答案 1

根据 JPA 规范,COUNT 返回一个 Long:

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

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

以下聚合函数可用于查询的 SELECT 子句:AVG、COUNT、MAX、MIN、SUM。

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

函数 SUM 和 AVG 的参数必须是数字。函数 MAX 和 MIN 的参数必须对应于可排序状态字段类型(即数值类型、字符串类型、字符类型或日期类型)。

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

  • COUNT 返回 Long。
  • MAX, MIN 返回应用它们的状态字段的类型。
  • AVG 返回 Double。
  • SUM 在应用于积分类型的状态字段(BigInteger 除外)时返回 Long;当应用于浮点类型的状态字段时,加倍;BigInteger 当应用于 BigInteger 类型的状态场时;和 BigDecimal(当应用于 BigDecimal 类型的状态字段时)。

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

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

聚合函数的参数前面可以加上关键字 DISTINCT,以指定在应用聚合函数之前要消除重复值。

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


答案 2

注意:JQPL本机查询之间存在差异

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

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

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

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


推荐