业务场景
公司前端框架引用了datatable.js,分页格式如下图所示,支持10,20,50,100,全部,前面数字页面可直接通过Spring组装对象传入JPA完成分页,但全部查询失败。
解决方案
1、查找datatable.js源码中关于分页参数,找到如下代码
"lengthMenu": [[10, 20, 50, 100, -1],[10, 20, 50, 100, "全部"]],
由此可知当我们页面选择“全部”的时候,页面传入后台页数参数为-1
2、查找JPA中的关于“查找全部”函数,找到如下符合我们判断页数的函数
public Page<T> findAll(Specification<T> spec, Pageable pageable) {
TypedQuery<T> query = getQuery(spec, pageable);
return pageable == null ?
new PageImpl<T>(query.getResultList()) : readPage(query, pageable, spec);
}
由此可知,JPA中判断了pageable是否为空,为空的时候返回全部内容,不为空的时候根据请求的页数请求对应的分页数据。 因此只要我们在这里支持页数为-1的时候分页即可,判断为-1的时候我们置pageable=null,这样就可以返回全部数据了,新增代码之后的代码下
public Page<T> findAll(Specification<T> spec, Pageable pageable) {
TypedQuery<T> query = getQuery(spec, pageable);
/**新增内容开始*/
//当判断前台传来的页数为-1的时候,手动置pageable为null
if(pageable.getPageSize()==-1){
pageable = null;
}
/**新增内容结束*/
return pageable == null ?
new PageImpl<T>(query.getResultList()) : readPage(query, pageable, spec);
}