JpaSpecificationExecutor接口是SpringDataJAP中的一个接口:
与其他的接口有点不一样,这个接口也包含了许多查询的条件,可以和JpaRepository,PagingAndSortingRepository接口一起使用
JpaRepository接口详解:接口详解
声明接口:
//条件查询
@Test
public void TestQuery(){
//DESC:降序排列 ASC:升序排列
Sort.Order order=new Sort.Order(Sort.Direction.DESC,"id");
Sort sort=new Sort(order);
//从0开始,显示的条数是5条 index是从0开始的 而不是从1开始
Pageable pageable=new PageRequest(0,5,sort);
/**
* root:需要查询的类型(employee)
* query:添加查询条件
* cb:构建Predicate
* */
Specification<Employee> specification=new Specification<Employee>() {
@Override
public Predicate toPredicate(Root<Employee> root,
CriteriaQuery<?> query,
CriteriaBuilder cb) {
//Path:拿到employee中的age
Path path=root.get("id");
//年龄大于50的 gt:大于
return cb.gt(path,5);
}
};
Page<Employee> page = employeeJpaSpecificationExecutor.findAll(specification,pageable);
System.out.println("查询的总页数: "+page.getTotalPages());
System.out.println("查询的总记录数: "+page.getTotalElements());
//这个是显示的是第几页 如是第一页的会显示的是第0页,一般来说是从第一页开始的所以+1
System.out.println("查询的当前第几页: "+(page.getNumber()+1));
System.out.println("查询的当前页面的集合: "+page.getContent());
System.out.println("查询的当前页面的记录数: "+page.getNumberOfElements());
}
结果
先前使用PagingAndSortingRepository接口中有个方法也是findAll,用此方法返回的也是page
PagingAndSortingRepository接口中的findAll方法:
所以只需要findAll方法中添加一个specification就行,两个findAll方法都返回的是page,就实现了分页排序和条件查询,这也是在开发中所常用的一个接口,因此我也记录下来;
再说明一下,我先前的接口是继承JpaSpecificationExecutor和JpaRepository接口,怎么就说到PagingAndSortingRepository接口中去了呢?因为JpaRepository接口也是继承PagingAndSortingRepository接口的,因此PagingAndSortingRepository接口中的方法JpaRepository也是能用的,以下是JpaRepository接口的底层代码
格言:不驰于空想,不骛于虚声