首页 > 解决方案 > JPA 规范分组

问题描述

我需要使用 JPA 规范为单个表执行 groupby 的帮助。

客户ID 顾客姓名 购买productid 购买日期
1 山姆 002 02.03.2021
3 005 05.03.2021
1 山姆 014 07.06.2021
2 布兰妮 015 10.07.2021

我想选择客户名称、count(purchaseproductid)、purchaseate 并将它们订购到purchaseate

使用 JPA 规范

这是我在规范中的代码

公共规范 filterCustomerPurchases(FilterParams filterParams, SortParams sortParams) {

    return (final Root<ItemConversions> root, final CriteriaQuery<?> cq, final CriteriaBuilder cb) -> {
        List<Predicate> predicates = new ArrayList<>();



        if (filterParams.purchaseProductId() != null && !filterParams.purchaseProductId().isEmpty()) {
             predicates.add(cb.equal(root.get("purchaseProductId"), filterParams.purchaseProductId()));
        }

        if (filterParams.purchaseCustomerName() != null && !filterParams.purchaseCustomerName().isEmpty()) {
                        predicates.add(cb.equal(root.get("purchaseCustomerName"), filterParams.purchaseCustomerName()));
                    }

        if (sortParams.getAsc() != null) {
            sortParams.getAsc().forEach(param -> {
                if (param != null && !param.isEmpty()) {
                    cq.orderBy(cb.asc(root.get(param)));
                }
            });
        }
        if (sortParams.getDesc() != null) {
            sortParams.getDesc().forEach(param -> {
                if (param != null && !param.isEmpty()) {
                    cq.orderBy(cb.desc(root.get(param)));
                }
            });
        }

        return cb.and(predicates.toArray(new Predicate[predicates.size()]));
    };

}

我在服务中调用它

customerPurcasesRepository.findAll(cutomerSpesifications.filterCustomerPurchases(filterParams, sortParams));

我想做过滤 + 排序 + groupby(customerId)

标签: spring-bootjpagroup-byspring-data-jpa

解决方案


规范旨在对 where 子句进行编码。它们不适合进行 Group By 或类似操作。您需要编写自己的自定义方法。


推荐阅读