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

时间:2010-08-26 10:04:27

标签: java orm jpa

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

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

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

7 个答案:

答案 0 :(得分:41)

根据JPA specification,COUNT会返回一个Long:

  

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

     

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

     

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

     

除了以外的所有聚合函数   COUNT,即路径表达式   聚合函数的参数   必须在状态字段中终止。该   COUNT的路径表达式参数可以   终止于状态字段或   association-field,或者参数   COUNT可能是身份证明   变量

     

函数SUM和AVG的参数   必须是数字。争论的   函数MAX和MIN必须对应   可订购的州域类型(即,   数字类型,字符串类型,字符   类型或日期类型)。

     

包含在中的Java类型   使用聚合的查询结果   功能如下:

     
      
  • COUNT返回Long。
  •   
  • MAX,MIN返回应用它们的状态字段的类型。
  •   
  • AVG返回Double。
  •   
  • 当应用于整数类型的状态字段时,SUM返回Long(其他   比BigInteger);应用时加倍   到浮点的状态字段   类型;应用BigInteger时   BigInteger类型的状态字段;和   应用时为BigDecimal   BigDecimal类型的状态字段。
  •   
     

如果使用SUM,AVG,MAX或MIN,和   没有价值观   可以应用聚合函数   聚合函数的结果是   NULL。

     

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

     

聚合函数的参数   可能在关键字前面   DISTINCT指定重复   价值将在之前消除   应用聚合函数。

     

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

答案 1 :(得分:10)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

AFAIK COUNT函数返回Long

答案 5 :(得分:1)

您可以直接返回整数,而不是整数。

return query.getSingleResult() != null ? Integer.parseInt(query.getSingleResult().toString()) : 0;

答案 6 :(得分:0)

return query.getSingleResult() != null ? Integer.parseInt(query.getSingleResult().toString()) : 0;

第二次调用query.getSingleResult()将抛出 org.hibernate.SessionException:会话已关闭!

为避免org.hibernate.SessionException:会话已关闭! 如下使用

Object obj = query.getSingleResult();
    if (obj != null) {
        Integer result = Integer.parseInt(obj.toString());
        return result;
    }

    return Integer.valueOf(0);