EntityManager.getSingleResult()
为COUNT个查询返回什么内容?
那么...... foo的精确运行时类型是什么?
Object foo = em.createQuery("SELECT COUNT(t) FROM com.company.Thing t WHERE prop = :param")
.setParameter("param", value).getSingleResult();
答案 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);