如果只是hibernate分页很简单。
Query q = session.createQuery("from Cat as c"); 
  q.setFirstResult(20000); 
  q.setMaxResults(100); 
  List l = q.list(); 

解决方案 »

  1.   

    谢谢楼上的,但我想要的不是这个.
    我是想要一个项目中,能用的上的,通用的分页程序.例如返回值可以是一个类:
    public class PageForm { private Integer totalPages = 0 ; //总页数
    private Integer currentPage = 0; //当前页
    private Integer nextPage = 0; //下一页
    private Integer prePage = 0;  //上一页
    private Integer totalRows = 0; //总共多少条记录
    private List list ;  //返回的数据列表
    private Integer pageSize = 0;//每页显示多少条记录
    set get 方法略
    }
    传入查询条件,和查询的条件,及要显示的页数,就可以得到以上一个类,调用起来就非常方便了.
    我自己写了一个,但总觉得不是很满意
      

  2.   

    你可以参考这里:Struts+Hibernate开发实践 分页的实现
    http://study.pay500.com/3/s32364.htm
      

  3.   

    谢谢rickhunterchen(千山鸟飞绝) ,这篇文章我已经看过了,但觉得他这个写的也不是很好.
    有没有其它的呢?
      

  4.   


    Query q = session.createQuery("from Cat as c"); 
      q.setFirstResult(20000); 
      q.setMaxResults(100); 
      List l = q.list(); 封装在楼主的PageForm 类中
      

  5.   

    下载下jaoso新闻系统,它 是struts+hibernate+spring+pager taglib2.0的分页。
      

  6.   

    to:esunboy(天使联盟) 
    我肯定知道封装在 pageForm类中啦! 只是想找一个相对通用,但效率又比较高的方法而已
      

  7.   

    先由 Query q = session.createQuery("from Cat as c"); 
      q.setFirstResult(20000); 
      q.setMaxResults(100); 
      List l = q.list(); 
    在这个方法中,把pageform中作为参数传入,然后替换一下Query q = session.createQuery("from Cat as c"); 
      q.setFirstResult(pageform.getcurrentPage()*pageform.getpageSize() ); 
      q.setMaxResults(.....); 
      List l = q.list(); 
    这样就可以只提取数据库中局你指定页码的数据到list中,提高性能
      

  8.   

    import java.util.List;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import com.sp.pojo.dao._RootDAO;public class SplitPages extends _RootDAO {
    private int pageNum;//总页数;
    private String curPage;//当前页;

    public String getCurPage() {
    return curPage;
    }
    public int getPageNum() {
    return pageNum;
    }
    public SplitPages() {
    SplitPages.initialize();
    }
    public SplitPages(Session session) {
    super(session);
    }
    protected Class getReferenceClass() {
    return null;
    }

    public void splitPages(String pageId,String hql)//pageId:到查第几页;hql:select count(*) from XXXPOJO
    {
    if(Tool.isEmp(pageId)||"1".equals(pageId))
    {
    pageId="0";
    }
    Session sess = super.getSession();
    Query query = sess.createQuery(hql);
    List countList = query.list();
    sess.close();
    Integer rows = (Integer)countList.get(0);
    this.pageNum = ((rows + 10) - 1) / 10;
    this.curPage=(pageId.equals("0")?"1":pageId);
    }
    }
      

  9.   

    我把我写的帖出来,大家提提意见吧
    mport java.util.List;/**
     * @author netfishx
     */
    public class PageForm { private Integer totalPages = 0 ; //总页数
    private Integer currentPage = 0; //当前页
    private Integer nextPage = 0; //下一页
    private Integer prePage = 0;  //上一页
    private Integer totalRows = 0; //总共多少条记录
    private List list ;  //返回的数据列表
    private Integer pageSize = 0;//每页显示多少条记录

    public Integer getCurrentPage() {
    return currentPage;
    }
    public void setCurrentPage(Integer currentPage) {
    this.currentPage = currentPage;
    }
    public List getList() {
    return list;
    }
    public void setList(List list) {
    this.list = list;
    }
    public Integer getNextPage() {
    return nextPage;
    }
    public void setNextPage(Integer nextPage) {
    this.nextPage = nextPage;
    }
    public Integer getPageSize() {
    return pageSize;
    }
    public void setPageSize(Integer pageSize) {
    this.pageSize = pageSize;
    }
    public Integer getPrePage() {
    return prePage;
    }
    public void setPrePage(Integer prePage) {
    this.prePage = prePage;
    }
    public Integer getTotalPages() {
    return totalPages;
    }
    public void setTotalPages(Integer totalPages) {
    this.totalPages = totalPages;
    }
    public Integer getTotalRows() {
    return totalRows;
    }
    public void setTotalRows(Integer totalRows) {
    this.totalRows = totalRows;
    }


    }
      

  10.   

    /**
     * 功能:主查询程序
     * @param hql:要查询的hql语句
     * @param values[]:值(对象数组)
     * @param currentPage:当前页
     * @param pageSize:每页要显示的数据条数 
     * @return
     */
    public  PageForm getPageResult(final String hql,final Object[] values, final Integer currentPage,final Integer pageSize) {   return (PageForm)getHibernateTemplate().execute( new HibernateCallback(){
     public Object doInHibernate(Session session) {


    /*****得到统计用的countSql,并统计出共有多少条符合条件的记录*****/
    String countHql = getCountHql(hql);
    Query query = session.createQuery(countHql);
    query = setQuery(query,values); //设置参数
    List list1 = query.list();   
    //得到总记录条数
    Integer totalRows = Integer.parseInt(list1.get(0).toString());



    query= session.createQuery(hql);
    query = setQuery(query,values);
    //共有多少页
    Integer totalPages =0;  
    totalPages = (int)Math.ceil((double)totalRows/pageSize);  

    //由于currentPage是final型的,不能修改,因此必须重新定义一个变量currentPage2代替它
    Integer currentPage2= currentPage; 
    if(currentPage<1) currentPage2=1;
    //如果当前页大于总页数,则显示最后一页
    if(currentPage>totalPages) currentPage2 = totalPages;
    //如果当前页小于0,则显示第一页
    if(currentPage<1) currentPage2 = 1;

    // 根据条件判断,取出所需记录
    int start = pageSize*(currentPage2-1);

    query.setFirstResult(start);
    query.setMaxResults(pageSize);

    List list = query.list();

    PageForm pageForm = new PageForm();
    pageForm.setTotalRows(totalRows); //记录总条数
    pageForm.setCurrentPage(currentPage);
    pageForm.setList(list);
    pageForm.setTotalPages(totalPages);
    pageForm.setPageSize(pageSize);
    if(currentPage<totalPages)
    pageForm.setNextPage(currentPage+1);
    else
    pageForm.setNextPage(currentPage);
    if(currentPage>1)
    pageForm.setPrePage(currentPage-1);
    else
    pageForm.setPrePage(currentPage);

    return pageForm;
    }
      });
    }
    /*
     * 根据正常hql,统计countHql
     * 做法:
     * 1.把from前面的变为select count(*) from
     * 2.把order by 去掉
     */
    private String getCountHql(String hql){
    int i = hql.toLowerCase().indexOf("from");
    String countHql = hql.substring(i,hql.length());
    countHql = "select count(*) "+countHql;
    return countHql;
    }
    /*
     *@得到数据类型 (传入java.lang.Boolean 得到Boolean)
     */
    private String getType(String typeParam) {   
    int last = typeParam.lastIndexOf(".");
    return typeParam.substring(last + 1);   
    }/*
     * 功能:设置查询条件
     */
    private Query setQuery(Query query,Object[] values){
    if(values == null)
    return query;
    int len = values.length;
    String type = "";
    for(int i=0;i<len;i++){

    type = getType(values[i].getClass().getName());   if (type.equals("String")) {
    query.setString(i, values[i].toString());
    }else if (type.equals("Integer")) {
    query.setInteger(i, (Integer)values[i]);
    }else if (type.equals("Date")) {
    query.setDate(i,(java.sql.Date)values[i]);
    }else if (type.equals("Boolean")) {
    query.setBoolean(i, (Boolean)values[i]);
    }else if (type.equals("Float")) {
    query.setFloat(i, (Float)values[i]);
    }else if (type.equals("Long")) {
    query.setLong(i, (Long)values[i]);
    }else if (type.equals("Short")) {
    query.setShort(i, (Short)values[i]);
    }else if (type.equals("Double")) {
    query.setDouble(i, (Double)values[i]);
    }else if(type.equals("Time")){
    query.setTime(i,(java.sql.Time)values[i]);
    }
    }
    return query;
      }
      

  11.   

    上面这一个是dao,在由正常hql生成统计用的countSql中,还需要再做些工作,例如把 order by去掉.
    这个在business层调用时,只需传入
    1.hql
    2.参数值(对象数组)
    3.当前要显示第几页
    4.每页要显示多少条记录
    就行了.原来的设计是要多传入一个统计共有多少条记录的hql,这条执行效率会高的多(执行 select count的效率比把数据取出再统计有多少条记录,高的不是一个数据级的).但这在business层 调用时会比较麻烦.
    欢迎大家批评( 不过不要骂人! :)  ).