JPA对多个字段模糊查询

本文介绍了一种使用实体类属性进行分页模糊查询的方法,并展示了如何通过在查询字符串前后添加通配符%来实现对userNickName和userWorkNo字段的模糊匹配。

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

//对userNickName和userWorkNo进行分页模糊查询
@Query(“select u from User u where concat(u.userNickName,u.userWorkNo) like :userNickName “)
Page findByUserNickNameContaining(Pageable pageable, @Param(“userNickName”) String userNickName);

concat(这儿放入与数据库字段对应的实体类中的属性,也是想要模糊查询的字段)

我上面没有在like后面写%,我在传入参数userNickName的时候加了%,例如:String userNickName = “%” + param.trim() +”%”;

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

余额充值