springJpa Specification 时间查询范围

该代码段展示了如何在Java应用中使用SpringDataJPA进行分页查询和模糊匹配。方法接收FileDto对象,从中获取当前页码、页码大小和过滤条件,如文件名、文件入库状态以及文件分析时间范围。然后,它创建一个Pageable对象用于排序和分页,并构建一个Specification来定义查询条件。最后,通过DAO调用findAll方法获取数据并返回PageModel结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public PageModel<FileEntity> getFiles(FileDto fileDto) {
        // 获取当前页码
        Integer pageNo = fileDto.getCurPage();
        // 获取页码大小
        Integer pageSize = fileDto.getPageSize();
        // 保证当前页码合法性
        pageNo = (null == pageNo || pageNo <= 0) ? 0 : (pageNo - 1);
        // 默认一页十条数据
        pageSize = (null == pageSize) ? 10 : pageSize;
        // 分页查询,字段排序
        Pageable pageable = PageRequest.of(pageNo, pageSize, Sort.by("id").descending());
        // 字段查询,模糊匹配
        Specification<FileEntity> specification = (root, query, criteriaBuilder) -> {
            List<Predicate> predicates = new ArrayList<>();
            // 文件名称
            // root.get("fileName") 是实体字段属性,不是数据库字段
            String fileName = fileDto.getFileName();
            if(StringUtils.isNotBlank(fileName)){
                predicates.add(criteriaBuilder.like(root.get("fileName"), "%" + fileName + "%"));
            }

            // 文件入库状态
            Integer fileSaveStatus = fileDto.getFileSaveStatus();
            if(null != fileSaveStatus){
                predicates.add(criteriaBuilder.equal(root.get("fileSaveStatus"), fileSaveStatus));
            }

            // 解析时间 大于等于
            Date startFileAnalysisTime = fileDto.getStartFileAnalysisTime();
            if(null != startFileAnalysisTime){
                predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("fileAnalysisTime").as(Date.class), startFileAnalysisTime));
            }
            // 解析时间 小于等于
            Date endFileAnalysisTime = fileDto.getEndFileAnalysisTime();
            if(null != endFileAnalysisTime){
                predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("fileAnalysisTime").as(Date.class), endFileAnalysisTime));
            }

            //返回查询条件
            return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
        };
        Page<FileEntity> fileEntitys = fileServiceDao.findAll(specification, pageable);
        // Page<AppReportMappingEntity> pageAll = appReportMappingDao.findAll(specification, pageable);
        return new PageModel(fileEntitys.getTotalElements(), fileEntitys.getTotalPages(), pageNo, pageSize, fileEntitys.getContent());
    }
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageModel<T> {
    private long totalRows;
    private long totalPages;
    private int curPage;
    private int pageSize;
    private List<T> result;

    public static PageModel transModel(Page page, List content) {
        PageModel pageModel = new PageModel();
        pageModel.setTotalRows(page.getTotalElements());
        pageModel.setTotalPages(page.getTotalPages());
        pageModel.setCurPage(page.getPageable().getPageNumber() + 1);
        pageModel.setPageSize(page.getPageable().getPageSize());
        pageModel.setResult(content);
        return pageModel;
    }
}
### JPA 中带有时间条件的模糊查询 为了实现在 Java Persistence API (JPA) 中带时间条件的模糊查询,可以采用 `Specification` 接口来构建动态查询逻辑。通过组合多个条件,能够灵活地创建复杂的查询表达式。 #### 创建自定义仓库接口 首先扩展默认的 `JpaRepository` 和 `JpaSpecificationExecutor` 来增强功能: ```java public interface CustomizedProductRepository extends JpaRepository<ProductEntity, Long>, JpaSpecificationExecutor<ProductEntity> { } ``` #### 定义实体类中的日期字段 假设有一个产品实体 (`ProductEntity`) 包含一个表示创建时间的属性 `createdDate`: ```java @Entity @Table(name = "products") public class ProductEntity { @Id private Long id; // ... other fields ... @Column(name = "created_date", nullable = false) private LocalDateTime createdDate; // getters and setters ... } ``` #### 构建 Specifications 方法 接下来编写服务层代码以利用 `Specifications` 对象来进行复杂查询操作。这里展示了一个例子,它不仅考虑到了名称部分匹配的情况,还加入了对特定时间段内记录的选择: ```java import org.springframework.data.jpa.domain.Specification; // import statements... private Specification<ProductEntity> buildQuerySpec(String namePart, LocalDate startDate, LocalDate endDate){ return ((root, query, criteriaBuilder) -> { List<Predicate> predicates = new ArrayList<>(); if (!StringUtils.isEmpty(namePart)) { Predicate predicateNameLike = criteriaBuilder.like( root.get("name"), "%" + namePart.replace("'", "") + "%"); predicates.add(predicateNameLike); } if (startDate != null && endDate != null) { Path<LocalDateTime> pathCreatedDate = root.<LocalDateTime>get("createdDate"); Predicate predicateStartDate = criteriaBuilder.greaterThanOrEqualTo(pathCreatedDate, startDate.atStartOfDay()); Predicate predicateEndDate = criteriaBuilder.lessThan(pathCreatedDate, endDate.plusDays(1).atStartOfDay()); predicates.add(criteriaBuilder.and(predicateStartDate, predicateEndDate)); } return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])); }); } ``` 上述方法允许传入可选参数用于指定商品名的部分字符串以及起始和结束日期范围。当这些参数被提供时,则会相应地加入到最终形成的 SQL 查询之中[^2]。 最后,在调用存储库的方法前应用这个规格说明实例即可完成整个过程: ```java List<ProductEntity> results = productRepo.findAll(buildQuerySpec("example%", startDay, endDay), PageRequest.of(pageNumber, pageSize)).toList(); ``` 这段代码片段展示了如何结合分页请求一起执行基于时间和关键词过滤的产品列表检索任务[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值