我想从数据库中获取一列之和并按两个字段分组的数据,其中参数将是动态的
我尝试使用谓词来实现,我能够获得分组依据,但总和不起作用。
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/