分页方法页数超出时返回的空list

竹林心风 发布于 2016/01/31 15:56
阅读 449
收藏 0

@JFinal 你好,想跟你请教个问题:

在class DbPro中有如下分页代码,

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

此种情况,有数据,select count(*)
,totalRow大于1,但是因为pageNumber> totalPage

而返回了空list

导致页面查询出来是空白列表


是我版本低了还是现在这个问题没有解决呢?

说一下我的操作:

1.先不带条件条件查询,有10页,点到第4页,此时前端分页参数是4

2.填入条件,此条件能查出2条数据,预计效果是返回2条数据,总页数变为1

3.点击搜索(相当于带了PageNumber=4,以及搜索条件),预计效果是返回2条数据的1页

4.返回结果是空

加载中
1
JFinal
JFinal

     我再补充一个具体的例子,在 oschina.net 这个网站上某个用户的动弹共有 73 页,点击这个链接可查看:http://my.oschina.net/u/257950?ft=&scope=3&showme=0&p=73 , 当你请求第 74 页的时候是没有数据的,点击这个改过页号的链接可以验证一下:http://my.oschina.net/u/257950?ft=&scope=3&showme=0&p=74 。

    oschina的问答区也可以验证一下,当某页没有数据时,网站会将请求重定向到另一个url,这个重定向的操作是业务解决方案,而不是框架做的。

    有时候,我们长期觉得理所当然的事情可能是不符合严谨的逻辑的。

0
JFinal
JFinal

   填入条件,总页数变为了 1 ,那么只有第一页才有数据。当 pageNumber=4 时,第 4 页是断不能有数据的,因为总页数才为 1 , 现在非要得到第四页的数,必定就是空白页。

   更好的做法是,在前端生成翻页链接时控制 pageNumber <= 总页数

竹林心风
竹林心风
回复 @JFinal : 作为用户,我说一下感受,这个是被测试作为bug提出来的,我找了好久才发现是源码不支持这个自动写法,首先不符合习惯,要花时间去跟踪这个现象。貌似hibernate对这种情况处理比较友好
JFinal
JFinal
回复 @张XIAO平 : 不同条件所得到的分页结果本身就会产生不同的页号,原来翻页用的url链接是针对上一个条件的,在新条件下已经不适用了
JFinal
JFinal
回复 @张XIAO平 : 逻辑的严谨性对于程序来说非常重要,总页数为 n,如果去获取 m > n 的那页,这个在逻辑上就是不存在的页不建议框架自主去做选择,否则终将会出很多意想不到的问题
竹林心风
竹林心风
在前端生成翻页链接时是没有问题的,按我的上面操作步骤,此种情况再正常不过了,翻了很多页,发现还没找到数据,就填入一个条件,页码可不就是当前的超出页码吗?不是手工填入的
竹林心风
竹林心风
看源代码,select count(*) 方法完全统计出了实际上有2条的,pageNumber如果超出,则让它等于1不好吗?明明有数据,只是因为页码超出了,就返回空白显得莫名其妙啊
0
JFinal
JFinal

    在这里继续回复方便点,hibernate 分页其实也不会自动决定空白页返回数据的,它是这么做的:

Query query = session.createQuery("select * from news");  
query.setFirstResult(offset);
query.setMaxResults(pageSize);
List result = query.list();

   setFirstResult 设置返回的偏移量,而setMaxResults 设置每页的记录条数,当这个偏移量超出了最后一条记录,那么是不会返回任何数据的。

  归根到底是做为框架的 jfinal或者 hibernate 无法非常确切地符合逻辑地决定在没有数据时该返回什么数据,这个决定最多可以当成是业务需求。

返回顶部
顶部