Как реализовать сумму в CriteriaQuery - PullRequest
0 голосов
/ 11 июня 2019

Я хочу получить данные с суммой из одного столбца и группы по двум полям из базы данных, где параметры будут динамическими

Я пытался реализовать с использованием предикатов. Я могу получить группу, носумма не работает.

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

Я ожидаю, что на выходе будет страница с суммой суммы оплаты и группировка по платежной лоте, PaymentSlot имеет одно отношение с платежными деталями

1 Ответ

1 голос
/ 11 июня 2019

Specifications предназначены для получения Predicate, который по сути является предложением where.

То, что вы также можете вызывать побочные эффекты через JPA API, является прискорбным недостатком JPA API. В Spring Data JPA нет поддержки для изменения возвращаемого значения через Specification. Для этого используйте реализацию пользовательского метода .

...