方法列表
Optional<T> findOne(@Nullable Specification<T> var1); //查询单个对象
List<T> findAll(@Nullable Specification<T> var1); //查询列表
//查询全部 分页
//Specification 查询条件
//Pageable 分页参数 -->两个参数 第一个是第几页 第二个是每页多少个
//返回值 分页pagebean page是springdatajpa提供的
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
//查询列表
//sort 排序参数 排序上的需求
List<T> findAll(@Nullable Specification<T> var1, Sort var2);
//统计查询 根据条件统计
long count(@Nullable Specification<T> var1);
Specification: 查询条件
代表所有的查询条件 我们把所有的查询条件封装成一个这样的对象传递过来就是了
他是一个接口
自定义自己的Specification实现类
实现一个方法
//root 查询的根对象(查询的任何属性都可以从根对象中获取)
//criteriaquery 顶层查询对象 -> 自定义查询方式 了解 一般不用
//criteriabuilder 查询的构造器 封装了很多查询的条件
Predicate toPredicate(Root<T> var1, CriteriaQuery<?> var2, CriteriaBuilder var3);
以下是一个完整的例子
@Service
public class MgrLostService {
@Autowired
LostRepository lostRepository;
public QueryResponseResult findAllMgrLost(int page, int size, MgrQueryLostRequest mgrQueryLostRequest) {
Specification<Lost> specification = new Specification<Lost>() {
@Override
/**
* 自定义查询条件
* 1.实现Specification接口(提供泛型,查询对象的类型)
* 2.实现toPredicate方法(构造条件查询)
* 3.需要借助方法参数中的两个参数(
* root:获取需要查询的对象属性
* CriteriaBuilder:构造查询条件,内部封装了很多查询条件(模糊匹配,精确匹配...)
*
* 查询条件
* 1.查询方式
* cb对象中
* 2.比较的属性名称
* root对象中
*
*/
public Predicate toPredicate(Root<Lost> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//用于暂时存放查询条件的集合
List<Predicate> predicatesList = new ArrayList<>();
//构造查询条件
//获取比较的属性
if (!StringUtils.isEmpty(mgrQueryLostRequest.getUserId()) && mgrQueryLostRequest.getUserId() != null) {
/**
* 第一个参数是要比较的属性 -> path对象
* 第二个参数是要比较的值
*/
Predicate userid = criteriaBuilder.equal(root.get("userId"), mgrQueryLostRequest.getUserId());
predicatesList.add(userid);
}
if (mgrQueryLostRequest.getSchoolId() != null && mgrQueryLostRequest.getSchoolId().size() != 0) {
predicatesList.add(criteriaBuilder.equal(root.get("schoolId"), mgrQueryLostRequest.getSchoolId()));
}
if (!StringUtils.isEmpty(mgrQueryLostRequest.getCategory()) && mgrQueryLostRequest.getCategory() != null) {
predicatesList.add(criteriaBuilder.equal(root.get("category"), mgrQueryLostRequest.getCategory()));
}
if (mgrQueryLostRequest.getStartTime() != null) {
predicatesList.add(criteriaBuilder.equal(root.get("startTime"), mgrQueryLostRequest.getStartTime()));
}
if (mgrQueryLostRequest.getEndTime() != null) {
predicatesList.add(criteriaBuilder.equal(root.get("endTime"), mgrQueryLostRequest.getEndTime()));
}
if (!StringUtils.isEmpty(mgrQueryLostRequest.getState()) && mgrQueryLostRequest.getState() != null) {
predicatesList.add(criteriaBuilder.equal(root.get("state"), mgrQueryLostRequest.getState()));
}
return criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
}
};
Pageable pageable = new PageRequest(page, size);
Page<Lost> pagelist = lostRepository.findAll(specification, pageable);
QueryResult queryResult = new QueryResult();
queryResult.setList(pagelist.getContent());//数据列表
queryResult.setTotal(pagelist.getTotalElements());//数据总记录数
System.out.println(new QueryResponseResult(CommonCode.SUCCESS, queryResult).toString());
return new QueryResponseResult(CommonCode.SUCCESS, queryResult);
}
}