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

时间:2015-03-26 20:40:07

标签: java jpa eclipselink criteria criteria-api

我在Windows 7中使用带有EclipseLink 2.5.0和MySQL 5.6的Spring MVC 4开发Web应用程序。我使用条件(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是一个数字(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)。推断类型Object不是有界参数

的有效替代

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

感谢任何帮助。

提前致谢!!

1 个答案:

答案 0 :(得分:2)

  

CriteriaBuilder类型的泛型方法sum(Expression)不是   适用于参数(Path)。推断类型Object不是   有效替代有界参数

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

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

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


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

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

如果您想在 Metamodel API 中使用强类型查询定义,则不再需要强制转换:

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