我在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版本是否会影响?
感谢任何帮助。
提前致谢!!
答案 0 :(得分:2)
CriteriaBuilder类型的泛型方法sum(Expression)不是 适用于参数(Path)。推断类型Object不是 有效替代有界参数
原因是编译器无法推断求和表达式的正确类型。
根据JPA规范javax.persistence.CriteriaBuilder.sum
方法定义为:
<N extends Number> Expression<N> sum(Expression<N> x);
所以我们希望将x
传递为Number
,Integer
,Double
,BigDecimal
等,而不是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)));