java - 如何在 CriteriaQuery 中实现求和

标签 java spring-data-jpa criteria-api

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

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

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

我希望输出是包含 amountpaid 总和并按 paymentlotid 分组的页面,PaymentSlot 与 paymentdetails 具有一对多关系

最佳答案

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

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

关于java - 如何在 CriteriaQuery 中实现求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56539838/

相关文章:

java - 字符串replaceAll连字符不工作java 8

java - 为什么 JavaFX WebView 不允许视频全屏模式

java - Spring Boot/Data JPA EntityScan 递归

java - 带有列表的 JPA CriteriaQuery 投影

java - JPA 条件 - 使用 where 子句获取

java - 在 Android Firebase 中实现基于用户的安全性

java - 如何在Java声音中连续改变音高?

java - 在带有数据库的单元/集成测试中仅加载 Spring Boot 数据/JPA 层

java - ManyToMany HQL Join - 连接的预期路径

java - 具有单向关系的 Criteria API