JPA/Eclipselink 使用条件对所有列值求和

JPA/Eclipselink sum all columns value using criteria

我正在使用 Spring MVC 4 和 EclipseLink 2.5.0 和 MySQL 5.6 在 Windows 7 中开发一个网络应用程序。我正在使用条件(Criteria Builder 和 CriteriaQuery ) 从数据库中获取所有字段的总和。 我想要实现的是本语句的等效 MySQL。

SELECT SUM(che_monto) FROM ssi_cheque WHERE che_fecha BETWEEN '2015-03-01
' AND '2015-03-31';

| sum(che_monto) |
+----------------+
|    54351367.00 |

注意: che_monto 是一个 Numeric(10,2) 字段。

我遇到的问题是,在几个教程中没有展示如何做到这一点(我认为因为很简单),只展示了如何对两个因素求和或进行复杂的数学运算。不管怎样,我已经生成了以下代码:

CriteriaBuilder criteriaBuilder = entityManager().getCriteriaBuilder();
CriteriaQuery<Number> query = criteriaBuilder.createQuery(Number.class);
Root<SsiCheque> fromSsiCheque = query.from(SsiCheque.class);
...
/** Code that works correctly to generate predicate */
...
query.select(criteriaBuilder.sum(ssiCheque.get("che_monto")))
    .where(predicates.toArray(new Predicate[]{}));

但是我有以下编译错误:

绑定不匹配: CriteriaBuilder 类型的泛型方法 sum(Expression) 不适用于参数 (Path)。推断类型对象不是有界参数的有效替代

我错过了什么? eclipselink 版本是否有影响?

感谢任何帮助。

提前致谢!!

The generic method sum(Expression) of type CriteriaBuilder is not applicable for the arguments (Path). The inferred type Object is not a valid substitute for the bounded parameter

原因是编译器无法为求和表达式推断出正确的类型。 根据 JPA 规范 javax.persistence.CriteriaBuilder.sum 方法定义为:

 <N extends Number> Expression<N> sum(Expression<N> x);

所以它应该作为 NumberIntegerDoubleBigDecimal 等传递 x,而不是 Object。这就是产生上述错误的原因。换句话说,编译器无法执行从 che_moto 参数表示的 Object 类型到 javax.persistence.CriteriaBuilder.sum 方法所期望的 Number 类型(或其后代)的隐式转换.


假设 che_monto 字段定义为 BigDecimal,示例解决方案可能如下所示:

query.select(criteriaBuilder.sum(ssiCheque.<BigDecimal>get("che_monto")));

如果您想通过 元模型 API 使用强类型查询定义,则不再需要转换:

query.select(criteriaBuilder.sum(ssiCheque.get(_SsiCheque.che_monto)));