gpt4 book ai didi

java - 如何在 CriteriaQuery 中实现求和

转载 作者:行者123 更新时间:2023-12-02 09:47:32 27 4
gpt4 key购买 nike

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

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com