jdk: 1.8
Spring Boot Version: 2.6.1
接口文档: Swagger2
本文将详解如何使用JpaSpecificationExecutor中的复杂查询分页接口实现多参数动态查询。
假如有一个实体类为用户:User,先建立实体类:
@Data
@Entity
@Table(name = "user")
public class User {
private Long id;
private String name;
private Integer age;
private String phoneNumber;
}
引入需要的Jpa Repository接口:
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
public interface UserService {
// 分页-列表-动态查询-接口
List<User> listPage(Map<String, Object> params, idList);
}
@Service("UserService")
public class UserServiceImpl implements UserService {
@Resource
private UserService service;
@Resource
private UserRepository repository;
@Override
public List<User> listPage(Map<String, Object> params, idList) {
// 直接调用repository中继承的接口,这里的JpaPageUtil是自己封装的分页工具,不作详解
// 使用自定义的whereUser静态方法,详解在下方
Page<User> list = repository.findAll(whereUser(params, idList), JpaPageUtil.getPageRequest(params));
return list;
}
// 自定义动态查询参数Specification, 自定义一个 whereUser 静态方法
private static Specification<user> whereUser(params, idList) {
return (Root<SystemField> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
// new一个查询条件,用来存放自定义的查询条件
List<Predicate> predicates = new ArrayList<>();
// 获取params中的 age,name,phoneNumber
Integer age = MapUtil.getInteger(params, "age");
String name = MapUtil.getString(params, "name");
String phoneNumber = MapUtil.getString(params, "phoneNumber");
// 假如前端传了idList,则查询出 id in idList 的所有用户
if (CollUtil.isNotEmpty(idList)) {
predicates.add(root.get("id").in(idList));
}
// 假如前端传了age,找出age匹配的所有用户
if (age!= null) {
predicates.add(cb.equal(root.get("age"), age));
}
// 假如前端传了name,写一个模糊查询找出匹配的所有用户
if (StringUtils.isNotBlank(name)) {
predicates.add(cb.like(root.get("name"), "%" + name + "%"));
}
// phoneNumer查询
if (phoneNumber!= null) {
predicates.add(cb.equal(root.get("phoneNumber"), phoneNumber));
}
// 最后,返回封装的所有查询条件
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
};
}
@RestController
@RequestMapping("/user")
public class userController (
@Resource
private UserService service;
@GetMapping("/list")
@ApiImplicitParams({
@ApiImplicitParam(name = "age", value = "年龄",required = false),
@ApiImplicitParam(name = "name", value = "姓名"required = false),
@ApiImplicitParam(name = "phoneNumber", value = "电话",required = false),
@ApiImplicitParam(name = "currPage", value = "页码",,required = false),
@ApiImplicitParam(name = "pageSize", value = "每页数据量",required = false)
})
public List<User> listPage(@RequestParam Map<String, Object> params) {
return service.listPage(params);
}