spring-boot - 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)
解决方案
规范旨在对 where 子句进行编码。它们不适合进行 Group By 或类似操作。您需要编写自己的自定义方法。
推荐阅读
- arrays - PowerShell从数组中过滤基于以分号分隔的电子邮件,以管道分隔的数组中的对象值
- java - 如何在同一流语句中对 Collectors.groupedBy 的结果进行排序?
- sql - 如何聚合行并转换为列?
- django - 没有主键和 id 的 django 模型
- c# - 如何在.net核心中通过kafka和web api之间的标准开放遥测协议进行消息跟踪
- npm-install - 已安装 NPM Sim 模块和 Sim Cordova 插件,但仍未检测到模块
- ios - Xcode 构建错误“架构 arm64 的未定义符号”
- r - 如何在 R 中使用 rvest 在 URL 上抓取多个表
- reactjs - 一个组件正在更改要控制的电子邮件类型的不受控制的输入
- c# - 是否可以从具有扩展名的项目中创建一个对象