做完简单的crud,这次变成条件查询
就比如前端可能传来几个模糊字符,进行在数据库中搜查
@RequestMapping(method = RequestMethod.POST,value = "/search")
public Result findSearch(@RequestBody Label label){
List<Label> list = labelService.findSearch(label);
return new Result(true, StatusCode.OK,"查询成功",list);
}
post方法,url为/label/search
查询到list,最后把list返回
重点在于service的方法
public List<Label> findSearch(Label label) {
return labelDao.findAll(new Specification<Label>() {
@Override
public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//where label like %小明%
List<Predicate> list = new ArrayList<>();
if(label.getLabelname()!=null && !"".equals(label.getLabelname())){
Predicate predicate = criteriaBuilder.like(root.get("labelname").as(String.class),"%"+label.getLabelname()+"%");
list.add(predicate);
}
// if(label.getState()!=null && !"".equals(label.getState())){
// Predicate predicate = criteriaBuilder.equal(root.get("state").as(String.class),label.getState());
// list.add(predicate);
// }
//new一个集合存放所有的条件
Predicate[] predicates = new Predicate[list.size()];
predicates = list.toArray(predicates);
return criteriaBuilder.and(predicates);
}
});
}
首先传入的值的是一个Specification<Label>
这样的一个对象,用了匿名内部类,创建一次即可。
public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder)
root是传入的label主题,criteriaQuery没什么用,最后的criteriaBuilder很有用
用来封装条件
最后会封装到一个Predicate predicate
这样一个对象,创建一个泛型为该类型的一个集合,把可能前端每个查询条件都写入一个集合,最后把这个集合转成一个数组用 cb.and(arg)传入拼接成查询条件,传给dao接口,dao接口继承了jpa的接口,直接调用内部的数据,完成查询。
分页查询
@RequestMapping(method = RequestMethod.POST,value = "/search/{page}/{size}")
public Result pageQuery(@RequestBody Label label,@PathVariable Integer page,@PathVariable Integer size){
Page<Label> list = labelService.pageQuery(label,page,size);
return new Result(true, StatusCode.OK,"查询成功",new PageResult<Label>(list.getTotalElements(),list.getContent()));
}
Controller层没什么特别的,参数多加了size,page,而且返回的是一个叫Page的对象,一会进一步研究一下,还有一个PageResult对象。
public Page<Label> pageQuery(Label label, Integer page, Integer size) {
Pageable pageable = PageRequest.of(page-1,size);
return labelDao.findAll(new Specification<Label>() {
@Override
public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//where label like %小明%
List<Predicate> list = new ArrayList<>();
if(label.getLabelname()!=null && !"".equals(label.getLabelname())){
Predicate predicate = criteriaBuilder.like(root.get("labelname").as(String.class),"%"+label.getLabelname()+"%");
list.add(predicate);
}
// if(label.getState()!=null && !"".equals(label.getState())){
// Predicate predicate = criteriaBuilder.equal(root.get("state").as(String.class),label.getState());
// list.add(predicate);
// }
//new一个集合存放所有的条件
Predicate[] predicates = new Predicate[list.size()];
predicates = list.toArray(predicates);
return criteriaBuilder.and(predicates);
}
},pageable);
}
service层比原来多了一个pageble对象
Pageable pageable = PageRequest.of(page-1,size);