【问题标题】:How to Implement sum in CriteriaQuery如何在 CriteriaQuery 中实现 sum
【发布时间】:2019-06-11 08:47:36
【问题描述】:

我想从参数将是动态的数据库中获取一列之和并按两个字段分组的数据

我尝试使用能够获得分组的谓词来实现,但总和不起作用。

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);

我希望输出的页面包含已支付金额的总和并按 Paymentslotid 分组,PaymentSlot 与 paymentdetails 具有单对偶关系

【问题讨论】:

    标签: java spring-data-jpa criteria-api


    【解决方案1】:

    Specifications 旨在生成一个Predicate,它本质上是一个 where 子句。

    您还可以通过 JPA API 触发副作用,这是 JPA API 的一个不幸的弱点。 Spring Data JPA 不支持通过Specification 更改返回值。为此使用custom method implementation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-05
      • 2017-06-01
      • 2017-04-15
      • 2021-01-31
      • 1970-01-01
      • 2022-07-07
      • 2023-01-19
      • 2015-05-15
      相关资源
      最近更新 更多