当前位置: 首页 > 知识库问答 >
问题:

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

高吉星
2023-03-14

我正在使用SpringMVC4和EclipseLink 2.5开发一个web应用程序。Windows 7中的0和MySQL 5.6。我使用criteria(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类型的通用方法和(表达式)不适用于参数(路径)。推断的类型Object不是有界参数的有效替代品

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

感谢您的帮助。

提前谢谢!!

共有1个答案

巩阳秋
2023-03-14

CriteriaBuilder类型的通用方法和(表达式)不适用于参数(路径)。推断的类型Object不是有界参数的有效替代品

原因是编译器无法为求和表达式推断正确的类型。根据JPA规范javax。坚持不懈标准制定者。总和法定义为:

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

因此,它预计将传递x作为Number整数BigDecimal等,而不是Object。这就是产生上述错误的原因。换句话说,编译器无法执行从由che_moto参数表示的Object类型到Number类型(或其后代)的隐式转换,这是javax.persistence.CriteriaB<--plhd所期望的--1/>方法。

假设cheu monto字段定义为BigDecimal示例解决方案如下所示:

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

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

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

 类似资料:
  • 在编写jpql查询时,我可以使用COLUMN()引用未映射的列(我知道它是eclipselink特定的)。在使用javax.persistence.criteria.CriteriaBuilder、javax.persistence.criteria.Predicate等构建标准时,有没有任何方法可以引用未映射的列? 我面临的问题:我有带有全文搜索列的postgresql表。我不希望它映射到实体对

  • 我真的需要你的帮助 我需要不时删除表中的所有内容,我使用的是Java JPA(EclipseLink)MySQL 我正在使用下面的代码,但没有成功,我对JPA一无所知 例外情况: 引起原因:异常[EclipseLink-8029](Eclipse持久性服务-2.3.2.v2011125-r10461):org。日食坚持不懈例外情况。JPQLException异常描述:编译查询[从fupfile删除

  • 问题内容: 自从我上次使用1.4.X版本以来,我一直在尝试更新有关J​​ava的知识…我正在尝试使用1.6.0,尤其是Java Persistence API(2.0)。 我设法创建了一个实体类。因为我能够存储和检索数据,所以它正在工作。 但是我无所事事,当我决定用表的列名填充JList时并没有成功… 这是一个简单的类,看起来像: 有没有办法检索列名? 我找到了这个帖子。似乎是一个有效的解决方案,

  • 问题内容: 该EclipseLink的文件说,我需要在我的pom.xml与Maven得到它下面的条目: 但是当我尝试使用注释时,NetBeans告诉我,找不到该类。确实如此:Eclipselink的javax.persistence包中没有Entity类。 我必须如何使用Maven设置Eclipselink? 问题答案: 该工件不提供JPA 2.0 API ,您需要添加: 为了简单起见,我建议使用

  • 问题内容: 使用样本数据: df 我试图弄清楚如何按key1分组数据并仅对key2等于“ one”的data1值求和。 这是我尝试过的 但这给了我一个数值为“无”的数据框 这里有什么想法吗?我正在寻找与以下SQL等效的Pandas: 提前致谢 问题答案: 首先按key1列分组: 然后为每个组取subDataFrame,其中key2等于“ one”并求和data1列: 为了解释发生了什么,让我们看一

  • 我知道类似的问题,但它们是在Hibernate的范围内被问到和回答的。我也有同样的问题,但我正在使用Eclipselink,想知道对于Hibernate,是否有更好的或替代的解决方案。 简单地回顾一下这个问题: 我有两个相互继承的类: 现在我想把一个孩子变成父母,或者反过来。 我希望现在p的数据库行是。 另一种方法是这样的: 在这种情况下,我希望与一起保存,并丢失的值。 然而,上面所描述的并不奏效