如何在Jpa中使用Pageable

时间:2018-03-26 09:37:07

标签: java spring datatables spring-data-jpa

我想在jpa,java,Datatables.js

中进行分页

我的控制器

@ResponseBody
@RequestMapping(value = "/notice_selectList.do")
public Map<String, Object> notice_selectList(HttpServletRequest request, Model model, @PageableDefault Pageable pageable) throws Exception{

    Map<String, Object> paramMap = RequestUtil.getParameterMap(request);
    Map<String, Object> resultMap = new HashMap<>();

    int length = Integer.parseInt((String) paramMap.get("length"));     //한페이지당 보여줄 글 갯수
    int start  = Integer.parseInt((String) paramMap.get("start"));      //시작페이지 

    int pageLength = (length == 0)?20:length;       
    int startPage = (start == 0)?1:start + 1;

    List<Sort.Order> orders = new ArrayList<Sort.Order>();
    orders.add(new Sort.Order(Sort.Direction.DESC, "noticeNo"));
    Sort sort = Sort.by(orders);

    PageRequest pageRequest = PageRequest.of(startPage, pageLength, sort);

    Page<Notice> noticeList = repository.findAll(pageRequest);

    //------------- dataTables에 맞게 키값 세팅
    //--------------data:데이터
    //--------------recordsTotal,recordsFiltered:갯수 및 페이징
    resultMap.put("data"            , noticeList.getContent());
    resultMap.put("recordsTotal"    , noticeList.getTotalElements());
    resultMap.put("recordsFiltered" , noticeList.getTotalElements());

    return resultMap;
}

我的存储库是

public interface NoticeRepository extends JpaRepository<Notice, Long>, QuerydslPredicateExecutor<Banner>{
    public Page<Notice> findAll(Pageable pageable);
}

第一页正确查看,

 select*
 from NOTICE
 order by NOTICE_NO desc 
limit 0, 20

但如果我点击第二页, 结果是

 select*
 from NOTICE
 order by NOTICE_NO desc 
limit 400, 20

然后点击第三页,

 select*
 from NOTICE
 order by NOTICE_NO desc 
limit 800, 20

为什么会这样?

1 个答案:

答案 0 :(得分:0)

首先,我将调试参数length和start包含的内容。如果它不是20或40并且paraMap确实包含这些值,我会查看我的请求通过网络(浏览器中的开发工具)。如果它发送正确的值并且启动仍然是错误的,请发布URL路径,我认为它是一个POST请求,让我们看一下。

如果您的请求中的值确实为200或400,请查看您的调用前端,可能是一些字符串Concantation,或者如果您使用Struts,Form Parsing问题。一个常见的错误是使用组合框的值和索引或类似的想法。如果您在前端搜索,请使用浏览器开发工具调试请求或表单,在模型中放置断点并尝试确定值切换到高位数的位置。