hibernate分页问题

基于SSH框架的分页Demo,用到了hibernate里的setFirstResult,setMaxResults,每一次重新部署启动Tomcat时候,有些小问题。望解答.
问题一:每次第一次跑项目时候没有分页查询而是查询了全部数据,怎么才能每次进入显示的是分页的查询?
URL:http://localhost:8090/TestPage/
图片描述

问题二:点击下一页,此时居然是第2页的内容。。。。
图片描述

问题三:多次点击上一页一直到头,此时有0页面,而我代码里判断了不会出现0页面状况??
图片描述

我的代码如下:

实体

package Entity;
public class Book {
    private int id;
    private String title;
    private int price;
    private String author;
    省略setget,和实体映射文件
}

action

package com.action;

import java.util.List;

import Entity.Book;
import Implements.book_Implements;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class BooksAction extends ActionSupport {
    private List<Book> bookList;
    private book_Implements bi;
    private int pageIndex;// 当前的页码
    private int pageSize;// 当前显示的条数
    省略setget....
    
    @Override
    public String execute() throws Exception {
        int maxPage = bi.countByPagesSize();
        // 上一页到头,不出现0页,最小也是第1页
        if (pageIndex <= 0) {
            pageIndex = 1;
        }
        // 下一页到头
        if (pageIndex > maxPage) {
            pageIndex = maxPage;
        }
        this.setBookList(bi.selectALL(pageIndex, pageSize));
        return "success";
    }
}

实现层(Dao)

package Implements;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Entity.Book;

public class book_Implements {
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    /**
     * 
     * @param pageIndex
     *            :当前的页码
     * @param pageSize
     *            :当前显示的条数
     * @return
     */
    // 分页查询
    public List<Book> selectALL(int pageIndex, int pageSize) {
        Session session = sessionFactory.openSession();
        Criteria query = session.createCriteria(Book.class);
        query.setFirstResult((pageIndex - 1) * pageSize);// 设置第一条记录的位置。
        query.setMaxResults(pageSize);// 设置最大返回的记录条数
        List<Book> bookList = query.list();
        return bookList;
    }

    /**
     * 计算总页数
     * 
     * @return
     */
    public int countByPagesSize() {
        int pagesize = 3;// 每页显示3条
        int maxPage = 0;// 最后一页的页码数
        Session session = sessionFactory.openSession();
        Criteria query = session.createCriteria(Book.class);
        List<Book> bookList = query.list();
        int count = bookList.size();// count=数据总数量
        // 计算总页数
        // 如果求余能算除尽,说明最后一页显示的数据个数就是一页当中显示的个数(3)
        if (count % pagesize == 0) {
            maxPage = count / pagesize;
        } else {
            // 求余大于0,说明多留个“小尾巴”
            maxPage = (count / pagesize) + 1;
        }
        return maxPage;
    }
}

页面
图片描述

阅读 3.7k
3 个回答

问题一我自己解决了,但问题二三依然存在,我不知道问题二三这样的会不会放在某些web项目会出现问题,目前我自己做的SSH项目的分页倒还没出现很大问题。当然有更好解决办法也请留言。

问题一:每次第一次跑项目时候没有分页查询而是查询了全部数据,怎么才能每次进入显示的是分页的查询?
解决如下:

action层

//在初始化的时候就给定页码和条数值,其他不变
private int pageIndex = 1;// 当前的页码
private int pageSize = 3;// 当前显示的条数
 public int countByPagesSize() {
       //int pagesize = 3;// 每页显示3条(删除掉,因为前面已经声明了)
        int maxPage = 0;// 最后一页的页码数
        Session session = sessionFactory.openSession();

问题解决
图片描述

Question3:
query.setFirstResult((pageIndex - 1) * pageSize);// 设置第一条记录的位置。
既然 pageIndex 能等于1,这个值最后就可以是零.
// 上一页到头,不出现0页,最小也是第1页
if (pageIndex <= 0) {

pageIndex = 1;

}
if 判断改为 pageIndex <= 1

梳理下,问题二和问题三应该是一类问题,问题二主要是没看懂,着重说下问题三吧

  1. 你action中pageIndex的最小值控制的是1没有问题,但你页面取值是pageIndex-1,所以就会出现0
  2. 为了保持页面出现正确的值,可以这样做处理,页面直接取pageIndex,不要做+1-1操作,查询数据库事,再做+1-1操作
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题