Jpa中分页功能可分为两种方式,一种是直接通过继承CrudRepository类实现,CrudRepository类是属于org.springframework.data.repository下的类,另一种是通过手动编写实现,然而这两种都需要用Pageable接口类,此类是在org.springframework.data.domain包下,下面是具体如何进行分页操作
继承方式:
编写一个XXRepository接口类,分别继承JpaSpecificationExecutor、CrudRepository,代码如下:
Repository接口代码:
/**
* XXX代表具体的domain对象名称
*/
public interface XXXRepository extends JpaSpecificationExecutor<T>, CrudRepository<T, ID> {
}
Service类代码:
@Service
public class XXXService{
@Autowired
private XXXRepository xxxRepository;
//获取总记录
public int getTotalCount(){
rerurn xxxRepository.findAll().size();
}
// 得到总页数
public int getTotalPage(int pageSize){
int totalCount = getTotalCount();
int totalPage = totalCount%pageSize == 0 ? totalCount/pageSize : totalCount/pageSize +1 ;
if(totalPage<1){
totalPage = 1;
}
return totalPage;
}
//分页搜索
// list 搜索条件集合 多个主键ID
public Page<XXX> findByPage(List list,Pageable pageable){
Specification<MyOrder> spec = SpecificationFactory.in("id", list);
return xxxRepository.findAll(spec,pageable);
}
}
Controller调用执行:
@Controller
@RequestMapping("/XXX")
public class XXXController {
//声明 xxxService
@Autowired
private XXXService xxxService;
//编写执行分页方法
@RequestMapping(value="/list",method=RequestMethod.GET)
public String list(Model model){
//总页数
int totalPage = xxxService.getTotalPage();
//每页展示数量
int pageSize = 50;
//当前页
int pageIndex = 1;
//设置降序展示数据
Sort sort = new Sort(Sort.Direction.ASC, "id");
//配置分页
Pageable pageAble= new PageRequest(pageIndex,pageSize,sort);
//构建查询条件
List<Integer> list = new ArrayList<Integer>();
list.add(11);
//执行搜索方法
Page<XXX> page = xxxService.findByPage(list,pageAble);
//打印数据
System.out.println(page);
//总元素
System.out.println(page.getTotalElements());
//总页数
System.out.println(page.getTotalPages());
//数据集合
for (XXX c:page.getContent()){
System.out.println(c.toString());
}
return null;
}
}
构建分页查询条件工具类:SpecificationFactory类,这个类名编写返回Specification类的检索条件方法
手动编写实现分页:
1.在XXXRepository类中编写分页方法:
//根据条件分页搜索 Page<XXX> findByStatus(int status, Pageable pageable);
2.在XXXService类实现其分页方法
public Page<XXX> findStatusByPage(int status,int size){ //总记录 int totalCount= getTotalByGoodsCounts(1); //每页展示数量 int pageSize=500; //总页数 int totalPage = totalCount%pageSize==0 ? totalCount/pageSize : totalCount/pageSize +1; //设置排序属性值 Sort sort = new Sort(Sort.Direction.ASC, "id"); Pageable pageAble= new PageRequest(1,size,sort); Page<XXX> pageResult = xxxRepository.findByStatus(status,pageAble); //打印结果 System.out.println(pageResult.getContent()+"---"); return null; }
3.Controller类中调用方法
xxxService.findStatusByPage(status,pageIndex);
完成分页功能