jfinal关于分页的bug反馈和解决办法

场景需要搜索的数据在第一页,现在翻到第二页进行搜索。此时搜索不出来结果。调试代码发现有问题。我的解决方式是重写翻页实现。

数据库是mysql,发现分页有问题的地方是在Model.java的这个方法里面

Page<> (Config configConnection connpageNumberpageSizeBoolean isGroupBySqlString selectString sqlExceptSelectObject... paras) Exception {
   (pageNumber < || pageSize < ) {
      ActiveRecordException()}
   (config..isTakeOverModelPaginate()) {
      config..takeOverModelPaginate(conngetUsefulClass()pageNumberpageSizeisGroupBySqlselectsqlExceptSelectparas)}
   
   String totalRowSql = + config..replaceOrderBy(sqlExceptSelect)List result = Db.(configconntotalRowSqlparas)size = result.size()(isGroupBySql == ) {
      isGroupBySql = size > }
   
   totalRow(isGroupBySql) {
      totalRow = size} {
      totalRow = (size > ) ? ((Number)result.get()).longValue() : }
   (totalRow == ) {
      Page<>(ArrayList<>()pageNumberpageSize)}
   
   totalPage = () (totalRow / pageSize)(totalRow % pageSize != ) {
      totalPage++}
   
   (pageNumber > totalPage) {
      Page<>(ArrayList<>()pageNumberpageSizetotalPage()totalRow)}
   
   String sql = config..forPaginate(pageNumberpageSizeselectsqlExceptSelect)List<> list = find(connsqlparas)Page<>(listpageNumberpageSizetotalPage()totalRow)}


我在BaseProjectModel.java重写的,代码以及注释如下

/**

     * 重写分页 解决 当前页数 大于 总页数时 的bug

     *

     * @param paginator       the page

     * @param select          the select part of the sql statement

     * @param sqlExceptSelect the sql statement excluded select part

     * @param paras           the parameters of sql

     * @return

     */

    @Override

    public Page<M> paginate(Paginator paginator, String select, String sqlExceptSelect, Object... paras) {


        Config config = getConfig();


        int pageNumber = paginator.getPageNo();

        int pageSize = paginator.getPageSize();


        if (pageNumber < 1 || pageSize < 1) {

            throw new ActiveRecordException("pageNumber and pageSize must more than 0");

        }



        String totalRowSql = "select count(*) " + config.getDialect().replaceOrderBy(sqlExceptSelect);

        List result = Db.query(totalRowSql, paras);

        int size = result.size();


        long totalRow;

        if (false) {

            totalRow = size;

        } else {

            totalRow = (size > 0) ? ((Number) result.get(0)).longValue() : 0;

        }


        if (totalRow == 0) {

            // totalRow = 0;

            return new Page<M>(new ArrayList<M>(0), pageNumber, pageSize, 0, 0);

        }


        int totalPage = (int) (totalRow / pageSize);

        if (totalRow % pageSize != 0) {

            totalPage++;

        }


        if (pageNumber > totalPage) {

            //return new Page<M>(new ArrayList<M>(0), pageNumber, pageSize, totalPage, (int)totalRow);

            //当前页数 大于总页数的时候 把当前页设置为第1页

            pageNumber = 1;

        }


        String sql = config.getDialect().forPaginate(pageNumber, pageSize, select, sqlExceptSelect);

        List<M> list = super.find(sql, paras);

        return new Page<M>(list, pageNumber, pageSize, totalPage, (int) totalRow);


    }

以上就是本人实际使用中发现的jfinal关于分页的bug反馈和解决办法。

用法

Page<TbArticle> page = TbArticle..paginate(getPaginator()sql.toString())setAttr(page)


评论区

JFinal

2018-07-17 16:53

jfinal 的分页不支持 order by 中带有函数,也不支持 select 子句中带有问号占位符,这个在文档中有说明,也有解决办法

jf大哥大

2018-07-17 17:22

@JFinal 刚才复制的代码有问题,现在已经更新了,分页确实需要调整一下比较好。

JFinal

2018-07-17 20:28

@jf大哥大 这个不是 bug,当页号大于总页数时,在逻辑上来说就是没有数据的

这个你可以根据 mysql 的 limit 子句进行验证,当 limit x, y 子句的参数在数据集范围之外时,必然没有数据,如果有数据反而是错误的

或是的话

2018-07-18 17:34

@JFinal JFinal中paginate 还分 好几种情况什么 order by 之类 能不能 直接就 整成一个api 不管什么sql 丢进 这个api就行