Java 如何在CriteriaQuery中实现sum

Java 如何在CriteriaQuery中实现sum,java,spring-data-jpa,criteria-api,Java,Spring Data Jpa,Criteria Api,我想从数据库中获取包含一列和两个字段的数据,其中的参数是动态的 我尝试使用谓词实现,我可以通过谓词获得组,但sum不起作用 Page<PaymentDetail> aggregatedPaymentDetails2 = paymentDetailRepository.findAll(new Specification<PaymentDetail>() { @Override public Predicate toPredic

我想从数据库中获取包含一列和两个字段的数据,其中的参数是动态的

我尝试使用谓词实现,我可以通过谓词获得组,但sum不起作用

Page<PaymentDetail> aggregatedPaymentDetails2 = paymentDetailRepository.findAll(new Specification<PaymentDetail>() {
            @Override
            public Predicate toPredicate(Root<PaymentDetail> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                final List<Predicate> predicates = new ArrayList<>();
                query.multiselect(root.get("id"), root.get("lockVersion"), cb.sum(root.get("amountPaid")), root.get("referenceNumber"), root.get("paymentSlot"));
                query.groupBy(root.get("referenceNumber"), root.get("paymentSlot").get("id"));
                for (final QueryCriterion queryCriterion : queryCriterionList) {
                    final OperatorEnum operatorEnum = queryCriterion.getOperatorEnum();
                    From join = root;
                    final String[] attributes = queryCriterion.getKey().split("\\.");
                    for (int i = 0, attributesLength = attributes.length - 1; i < attributesLength; i++) {
                        join = join.join(attributes[i], JoinType.LEFT);
                    }
                    final Path path = join.get(attributes[attributes.length - 1]);
                    final Object value = dataTypesHelper.typeCastValue(path, queryCriterion);
                    predicates.add(operatorEnum.getOperator().getPredicateByKeyAndValue(path, value, cb));

                }
                   return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }

        },pageable);
Page aggregatedPaymentDetails2=paymentDetailRepository.findAll(新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
最终列表谓词=new ArrayList();
query.multiselect(root.get(“id”)、root.get(“lockVersion”)、cb.sum(root.get(“amountPaid”)、root.get(“referenceNumber”)、root.get(“paymentSlot”);
groupBy(root.get(“referenceNumber”)、root.get(“paymentSlot”).get(“id”);
对于(最终查询标准查询标准:查询标准列表){
final OperatorEnum OperatorEnum=queryCriterion.getOperatorEnum();
From join=root;
最后一个字符串[]attributes=queryCriterion.getKey().split(“\\”);
for(inti=0,attributesLength=attributes.length-1;i

我希望输出是pagewithamountpayed和groupbypaymentslotid之和,PaymentSlot与paymentdetails有一个one-omany关系。详细信息

规范
旨在生成一个
谓词
,它本质上是一个where子句

您还可以通过JPAAPI触发副作用,这是JPAAPI的一个不幸弱点。Spring Data JPA中不支持通过
规范更改返回值。为此使用一个新的方法