Springdata集成page分页分析
1、Page<>是一个遵循JPA规范的分页接口,里面的泛型是对应封装的domain类
2、下面代码主要是我在使用mongodb数据库时的,查询分页方法
3、Page<>本身只是一个接口,一般的分页插件或者自定义分页类都需要去返回一个分页结果集,也就是实例对象;所以这里就直接返回Page<>的实现类对象,PageImpl<>的构造器如下
public PageImpl(List<T> content, Pageable pageable, long total) {
super(content, pageable);
this.total = (Long)pageable.toOptional().filter((it) -> {
return !content.isEmpty();
}).filter((it) -> {
return it.getOffset() + (long)it.getPageSize() > total;
}).map((it) -> {
return it.getOffset() + (long)content.size();
}).orElse(total);
}
public PageImpl(List<T> content) {
this(content, Pageable.unpaged(), null == content ? 0L : (long)content.size());
}
//其实也都要调用第一个构造器
List content:数据列表
Pageable pageable:封装分页数据对象,也就是currentPage 和 pageSize
total:数据总数
4、但是PageImpl的构造方法中,List content的是不能为null的,因为方法中调用了父类构造器super(content, pageable);
Assert.notNull(content, "Content must not be null!");
一旦为空就会报错
5、所以肯定是要先判断数据的数量的,方法如下
@Autowired
//1)创建mongodb查询模板
private MongoTemplate template;
public Page<Region> query(RegionQueryObjecy qo) {
//2)语句对象query 封装查询条件,在高级查询的时候使用
Query query = new Query();
//3)判断数据的数量
long total = template.count(query, Region.class);
if (total==0){
return Page.empty();
}
//4)PageRequest是封装查询方法,然后返回pageable对象,给PageImpl的构造方法使用
Pageable pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "_id");
//5)字太多放下面
query.with(pageable);
//6)获取数据列表
List<Region> list = template.find(query, Region.class);
//7)获取查询结果集
return new PageImpl<>(list,pageable,total);
}
6)此时pageable和total都有了,还差个list,三大参数还差一个;因为有了pageable对象,可以用query的with方法,把pageable中的查询条件,一个个抽出来封装到query中,不然的话,就要一个一个重新加进去同query.skip(qo.getCurrentPage()).limit(qo.getPageSize()).with(new Sort(Sort.Direction.ASC,“id”));
7)这个例子主要是使用query与数据库交互查询获取list和total,然后再加个pageable就可以获取到查询结果集啦
博主码字不易,觉得有帮助的点个赞哦