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);
所以它应该作为 Number
、Integer
、Double
、BigDecimal
等传递 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)));
我正在使用 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);
所以它应该作为 Number
、Integer
、Double
、BigDecimal
等传递 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)));