spring boot中rest接口实现条件查询的核心是动态构建查询逻辑:用@requestparam接收可选参数或dto封装校验,结合criteria api/querydsl生成类型安全查询,再通过pageable统一处理分页排序。

Spring Boot 中 REST 接口实现条件查询,核心是把查询条件作为请求参数接收,并在服务层动态拼装查询逻辑——不硬编码 if-else 分支,而是用灵活、可扩展的方式响应不同组合的筛选需求。
用 @RequestParam 接收多个可选条件
适合字段不多、逻辑较轻的场景。将每个查询字段声明为 @RequestParam(required = false),后端根据非空值动态构建查询条件。
- ID、姓名、状态、创建时间范围等都可设为可选参数
- 前端调用时只传需要的参数,例如:
/api/users?name=张&status=ACTIVE - Controller 中不做具体查询,只做参数校验和转发,把组装逻辑交给 Service 层
用 DTO 封装查询参数并校验
当条件较多或需类型转换、范围校验(如日期区间、数值范围)时,推荐定义专用的查询 DTO。
- DTO 可加
@Valid或自定义注解(如@DateRange)做约束 - 避免 Controller 方法签名过长,也方便复用和单元测试
- 示例:UserQueryDTO 包含
String name、Integer minAge、LocalDateTime startTime等字段
结合 JPA Criteria API 或 QueryDSL 动态构建查询
面向数据库的复杂条件查询,应避免拼 SQL 字符串,优先使用类型安全的动态查询方案。
- Criteria API 利用元模型生成类型安全的查询条件,支持 AND/OR/Nested 组合
- QueryDSL 提供更简洁的链式写法,如
user.name.eq("张").and(user.age.goe(18)) - 配合 Spring Data JPA 的
Specification接口,可将条件逻辑拆分为独立可复用的方法
分页与排序一并处理
条件查询通常伴随分页和排序,建议统一用 Pageable 封装。
- 前端传
page=0&size=10&sort=name,asc&sort=createdAt,desc - Controller 方法参数直接接收
@ParameterObject Pageable pageable - Service 层将条件查询 + 分页参数一起传给 Repository,返回
Page<user></user>











