如何在Spring JPA的DatatableRepository中按日期范围查询数据
实现Spring JPA DataTablesRepository的日期范围查询
要实现按日期范围查询,你需要自定义查询逻辑,解析前端传入的范围参数并构建对应的查询条件,以下是具体步骤:
1. 确保Repository继承必要接口
你的MyDataRepository需要同时继承DataTablesRepository和JpaSpecificationExecutor,这样才能支持自定义查询条件:
public interface MyDataRepository extends DataTablesRepository<MyData, Long>, JpaSpecificationExecutor<MyData> { }
2. 修改控制器逻辑,解析日期范围
不再直接调用findAll(input),而是解析DataTablesInput中date列的搜索值,构建日期范围查询条件:
import org.springframework.util.StringUtils; import javax.persistence.criteria.Predicate; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @PostMapping("/datatable") public DataTablesOutput<MyData> getMyDatatable(@Valid @RequestBody DataTablesInput input) { // 构建自定义查询条件 Specification<MyData> dateRangeSpec = (root, query, cb) -> { List<Predicate> predicates = new ArrayList<>(); // 遍历所有列,找到date列的搜索条件 for (DataTablesInput.Column column : input.getColumns()) { if ("date".equals(column.getData()) && StringUtils.isNotBlank(column.getSearch().getValue())) { String rangeValue = column.getSearch().getValue(); // 按~分割起始和结束日期(可根据需求更换分隔符) String[] dateParts = rangeValue.split("~"); if (dateParts.length == 2) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate startDate = LocalDate.parse(dateParts[0].trim(), formatter); LocalDate endDate = LocalDate.parse(dateParts[1].trim(), formatter); // 添加日期范围查询条件 predicates.add(cb.between(root.get("date"), startDate, endDate)); } } } return cb.and(predicates.toArray(new Predicate[0])); }; // 传入自定义条件执行查询 return myDataRepository.findAll(input, dateRangeSpec); }
3. 前端请求传入日期范围
在Insomnia(或前端DataTables组件)的请求中,将date列的search.value设置为用分隔符连接的日期范围,比如2023-03-01~2023-03-07:
{ "draw": 1, "columns": [ { "data": "date", "name": "date", "searchable": true, "orderable": true, "search": { "value": "2023-03-01~2023-03-07", "regex": false } } ], "order": [ { "column": 0, "dir": "asc" } ], "start": 0, "length": 100, "search": { "value": "", "regex": false } }
额外说明
- 如果你的
date字段是LocalDateTime类型,需要将结束日期调整为当天的23:59:59,避免漏查当天的数据:LocalDate endDate = LocalDate.parse(dateParts[1].trim(), formatter); LocalDateTime endDateTime = endDate.atTime(23, 59, 59); predicates.add(cb.between(root.get("date"), startDate.atStartOfDay(), endDateTime)); - 分隔符可根据需求自定义(比如
-或|),只要前后端保持一致即可。
内容的提问来源于stack exchange,提问作者Ekatama Ilham Prayoga
相关产品推荐
相关产品推荐

