Spring Boot带查询参数的/users GET请求如何对接JPA实现用户筛选
解决方案
1 先修复控制器参数不匹配问题
你当前Postman请求用的参数是role=admin,但控制器里对应接收角色的参数配置是@RequestParam( required = false, name = "roles") String roles,参数名不匹配会导致角色参数接收为空,这是你当前请求异常的核心原因之一,二选一修改即可:
- 把请求参数改为
roles=admin - 把控制器对应行改为
@RequestParam( required = false, name = "role") String roles
2 编写Repository层查询方法
完全不需要拼接SQL,用JPQL原生的动态条件语法即可,兼容H2和PostgreSQL,后续切换数据库不需要修改代码,直接在你现有的UserRepository中新增如下方法:
@Query("SELECT u FROM User u WHERE " + "(:name IS NULL OR u.name = :name) AND " + "(:title IS NULL OR u.title = :title) AND " + "(:roles IS NULL OR u.roles = :roles) AND " + "(:email IS NULL OR u.email = :email) AND " + "(:password IS NULL OR u.password = :password)") List<User> findByConditions(String name, String title, String roles, String email, String password);
逻辑说明:每个参数如果前端没有传(值为null),对应的条件会自动判定为成立,不会参与过滤;只有参数有实际传值时,才会作为过滤条件匹配数据库字段,完美适配多可选参数的查询需求。
注意:上述代码中
u.xxx的字段名需要和你User实体类的实际字段名保持一致,比如实体类角色字段如果叫role就改成u.role = :roles即可。
3 编写Service层逻辑
直接透传参数即可,不需要额外的判空处理:
UserService 接口新增方法
List<User> listUsersByConditions(String name, String title, String roles, String email, String password);
UserServiceImpl 实现类新增逻辑
@Override public List<User> listUsersByConditions(String name, String title, String roles, String email, String password) { return userRepository.findByConditions(name, title, roles, email, password); }
4 完善控制器调用逻辑
把控制器中原来的返回行替换为:
return ResponseEntity.ok(userService.listUsersByConditions(name, title, roles, email, password));
内容的提问来源于stack exchange,提问作者Cody McCarty
相关产品推荐
相关产品推荐

