Sring Data JPA使用Predicate进行模糊查询、按时间段查询

本文介绍如何使用Spring Data JPA实现基于条件的分页查询,包括模糊查询、精确查询及时间范围查询,通过PageRequest和Specification实现灵活的数据检索。

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

 项目示例

Integer num = demoDTO.getNum() == null ? 0 : demoDTO.getNum();
Integer size = demoDTO.getSize() == null ? 10 : demoDTO.getSize();
		
PageRequest pageRequest = new PageRequest(num, size, new Sort(Sort.Direction.DESC, "userId"));
Specification<WorkOrderDO> specification = new Specification<WorkOrderDO>() {
        @Override
	public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {
		Predicate predicate = cb.conjunction();
                //模糊查询
		if (demoDTO.getNum() != null) {
			predicate.getExpressions().add(cb.like(root.get("num"), "%" + demoDTO.getNum() + "%"));
		}
                //准确查询
		if (demoDTO.getName() != null) {
			predicate.getExpressions().add(cb.equal(root.get("name"), demoDTO.getName()));
		}
		String startTime = demoDTO.getStart();
		String endTime = demoDTO.getEnd();
		//起始日期
		if (startTime != null && !startTime.trim().equals("")) {
                        //时间大于
			predicate.getExpressions()
		.add(cb.greaterThanOrEqualTo(root.get("time").as(String.class), startTime));
		}
		//结束日期
		if (endTime != null && !endTime.trim().equals("")) {
                        //时间小于
			predicate.getExpressions()
		.add(cb.lessThanOrEqualTo(root.get("time").as(String.class), endTime + " 23:59:59"));
		}
		return predicate;
	}
};
Page<WorkOrderDO> page = workRep.findAll(specification, pageRequest);

 

### 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、付费专栏及课程。

余额充值