只要一个简单的分页第三方没想到这么难啊
初衷只希望满足
1.采用每次取出一部分的,分页方式.而不是把数据全部取出来才分页
   (
     1.全部取出来效率低 
     2.全部取出来分.如果并发大的话会造成,新增的信息不再该次分页中出现,或者删除的信息依然出现在分页里
   )
2.希望能多点分页Style来选择
  (
   1.首页 上页 下页 尾页
   2.1 2 3 4 5 6 7 8...(Google模式)
  )
  
 最后我找来找去阿!就为了满足我这两个小小的要求阿!
 DisplayTag和ValueList不满足我的要求1
 eXtremeComponents说是用limit可以做到一次只取出一部分数据啊!但是我不明白,获得数据的时候,Sql是一次把全部数据都取出来了放入Rs或者List.
 难道limit是每次都要把全部数据重新拿出来一次.然后在再获取的Rs或List这一层里定位?那这样不是效率更低吗?
 而且eXtremeComponents也不支持我希望的要求2
 同时这个项目据说也不维护了啊...后续版本叫 Jmesa 真是搞得人很乱啊
 
 国内也有一个团队在做一个叫 GT-Grid 的东西也是基于 eXtremeComponents的.最后
 单独了现在叫 ECSide 
 看起来不错啊.............可以Exp PDF 还可以order by List 
 但是这两个基本功能...却都没有人做到啊!
 他们都说自己是做一个......表单类...但是忘记了他们本来是为了分页来的

解决方案 »

  1.   

    分页一直是个值得研究的问题,因为经常遇到,我也暂时没遇到合适的而且重用性高的解决方案。
    分页的原理我是明白的,不得不说,
    初衷只希望满足
    1.采用每次取出一部分的,分页方式.而不是把数据全部取出来才分页
       (
         1.全部取出来效率低 
         2.全部取出来分.如果并发大的话会造成,新增的信息不再该次分页中出现,或者删除的信息依然出现在分页里
       ) 
    好些代码为了简单,都是全取出来的,当数据量多是,肯定是不行的。下面转载javaeye一位牛人robbin的分页解决方案:
    http://www.javaeye.com/topic/14657?page=1
    Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改。 分页支持类: package com.javaeye.common.util;   
      
    import java.util.List;   
      
    public class PaginationSupport {   
      
        public final static int PAGESIZE = 30;   
      
        private int pageSize = PAGESIZE;   
      
        private List items;   
      
        private int totalCount;   
      
        private int[] indexes = new int[0];   
      
        private int startIndex = 0;   
      
        public PaginationSupport(List items, int totalCount) {   
            setPageSize(PAGESIZE);   
                    setTotalCount(totalCount);   
            setItems(items);           
            setStartIndex(0);   
        }   
      
        public PaginationSupport(List items, int totalCount, int startIndex) {   
                    setPageSize(PAGESIZE);   
            setTotalCount(totalCount);   
            setItems(items);           
            setStartIndex(startIndex);   
        }   
      
        public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) {   
                    setPageSize(pageSize);   
            setTotalCount(totalCount);   
            setItems(items);   
            setStartIndex(startIndex);   
        }   
      
        public List getItems() {   
            return items;   
        }   
      
        public void setItems(List items) {   
            this.items = items;   
        }   
      
        public int getPageSize() {   
            return pageSize;   
        }   
      
        public void setPageSize(int pageSize) {   
            this.pageSize = pageSize;   
        }   
      
        public int getTotalCount() {   
            return totalCount;   
        }   
      
        public void setTotalCount(int totalCount) {   
            if (totalCount > 0) {   
                this.totalCount = totalCount;   
                int count = totalCount / pageSize;   
                if (totalCount % pageSize > 0)   
                    count++;   
                indexes = new int[count];   
                for (int i = 0; i < count; i++) {   
                    indexes[i] = pageSize * i;   
                }   
            } else {   
                this.totalCount = 0;   
            }   
        }   
      
        public int[] getIndexes() {   
            return indexes;   
        }   
      
        public void setIndexes(int[] indexes) {   
            this.indexes = indexes;   
        }   
      
        public int getStartIndex() {   
            return startIndex;   
        }   
      
        public void setStartIndex(int startIndex) {   
            if (totalCount <= 0)   
                this.startIndex = 0;   
            else if (startIndex >= totalCount)   
                this.startIndex = indexes[indexes.length - 1];   
            else if (startIndex < 0)   
                this.startIndex = 0;   
            else {   
                this.startIndex = indexes[startIndex / pageSize];   
            }   
        }   
      
        public int getNextIndex() {   
            int nextIndex = getStartIndex() + pageSize;   
            if (nextIndex >= totalCount)   
                return getStartIndex();   
            else  
                return nextIndex;   
        }   
      
        public int getPreviousIndex() {   
            int previousIndex = getStartIndex() - pageSize;   
            if (previousIndex < 0)   
                return 0;   
            else  
                return previousIndex;   
        }   
      
    }  
      

  2.   

    下面转载javaeye一位牛人robbin的分页解决方案:
    http://www.javaeye.com/topic/14657?page=1
    Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改。 分页支持类: package com.javaeye.common.util;   
      
    import java.util.List;   
      
    public class PaginationSupport {   
      
        public final static int PAGESIZE = 30;   
      
        private int pageSize = PAGESIZE;   
      
        private List items;   
      
        private int totalCount;   
      
        private int[] indexes = new int[0];   
      
        private int startIndex = 0;   
      
        public PaginationSupport(List items, int totalCount) {   
            setPageSize(PAGESIZE);   
                    setTotalCount(totalCount);   
            setItems(items);           
            setStartIndex(0);   
        }   
      
        public PaginationSupport(List items, int totalCount, int startIndex) {   
                    setPageSize(PAGESIZE);   
            setTotalCount(totalCount);   
            setItems(items);           
            setStartIndex(startIndex);   
        }   
      
        public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) {   
                    setPageSize(pageSize);   
            setTotalCount(totalCount);   
            setItems(items);   
            setStartIndex(startIndex);   
        }   
      
        public List getItems() {   
            return items;   
        }   
      
        public void setItems(List items) {   
            this.items = items;   
        }   
      
        public int getPageSize() {   
            return pageSize;   
        }   
      
        public void setPageSize(int pageSize) {   
            this.pageSize = pageSize;   
        }   
      
        public int getTotalCount() {   
            return totalCount;   
        }   
      
        public void setTotalCount(int totalCount) {   
            if (totalCount >  0) {   
                this.totalCount = totalCount;   
                int count = totalCount / pageSize;   
                if (totalCount % pageSize >  0)   
                    count++;   
                indexes = new int[count];   
                for (int i = 0; i  < count; i++) {   
                    indexes[i] = pageSize * i;   
                }   
            } else {   
                this.totalCount = 0;   
            }   
        }   
      
        public int[] getIndexes() {   
            return indexes;   
        }   
      
        public void setIndexes(int[] indexes) {   
            this.indexes = indexes;   
        }   
      
        public int getStartIndex() {   
            return startIndex;   
        }   
      
        public void setStartIndex(int startIndex) {   
            if (totalCount  <= 0)   
                this.startIndex = 0;   
            else if (startIndex > = totalCount)   
                this.startIndex = indexes[indexes.length - 1];   
            else if (startIndex  < 0)   
                this.startIndex = 0;   
            else {   
                this.startIndex = indexes[startIndex / pageSize];   
            }   
        }   
      
        public int getNextIndex() {   
            int nextIndex = getStartIndex() + pageSize;   
            if (nextIndex > = totalCount)   
                return getStartIndex();   
            else  
                return nextIndex;   
        }   
      
        public int getPreviousIndex() {   
            int previousIndex = getStartIndex() - pageSize;   
            if (previousIndex  < 0)   
                return 0;   
            else  
                return previousIndex;   
        }   
      
    }  
     
      

  3.   

    抽象业务类   /**  
     * Created on 2005-7-12  
     */  
    package com.javaeye.common.business;   
      
    import java.io.Serializable;   
    import java.util.List;   
      
    import org.hibernate.Criteria;   
    import org.hibernate.HibernateException;   
    import org.hibernate.Session;   
    import org.hibernate.criterion.DetachedCriteria;   
    import org.hibernate.criterion.Projections;   
    import org.springframework.orm.hibernate3.HibernateCallback;   
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
      
    import com.javaeye.common.util.PaginationSupport;   
      
    public abstract class AbstractManager extends HibernateDaoSupport {   
      
        private boolean cacheQueries = false;   
      
        private String queryCacheRegion;   
      
        public void setCacheQueries(boolean cacheQueries) {   
            this.cacheQueries = cacheQueries;   
        }   
      
        public void setQueryCacheRegion(String queryCacheRegion) {   
            this.queryCacheRegion = queryCacheRegion;   
        }   
      
        public void save(final Object entity) {   
            getHibernateTemplate().save(entity);   
        }   
      
        public void persist(final Object entity) {   
            getHibernateTemplate().save(entity);   
        }   
      
        public void update(final Object entity) {   
            getHibernateTemplate().update(entity);   
        }   
      
        public void delete(final Object entity) {   
            getHibernateTemplate().delete(entity);   
        }   
      
        public Object load(final Class entity, final Serializable id) {   
            return getHibernateTemplate().load(entity, id);   
        }   
      
        public Object get(final Class entity, final Serializable id) {   
            return getHibernateTemplate().get(entity, id);   
        }   
      
        public List findAll(final Class entity) {   
            return getHibernateTemplate().find("from " + entity.getName());   
        }   
      
        public List findByNamedQuery(final String namedQuery) {   
            return getHibernateTemplate().findByNamedQuery(namedQuery);   
        }   
      
        public List findByNamedQuery(final String query, final Object parameter) {   
            return getHibernateTemplate().findByNamedQuery(query, parameter);   
        }   
      
        public List findByNamedQuery(final String query, final Object[] parameters) {   
            return getHibernateTemplate().findByNamedQuery(query, parameters);   
        }   
      
        public List find(final String query) {   
            return getHibernateTemplate().find(query);   
        }   
      
        public List find(final String query, final Object parameter) {   
            return getHibernateTemplate().find(query, parameter);   
        }   
      
        public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria) {   
            return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0);   
        }   
      
        public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int startIndex) {   
            return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex);   
        }   
      
        public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize,   
                final int startIndex) {   
            return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {   
                public Object doInHibernate(Session session) throws HibernateException {   
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
                    int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
                    criteria.setProjection(null);   
                    List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
                    PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);   
                    return ps;   
                }   
            }, true);   
        }   
      
        public List findAllByCriteria(final DetachedCriteria detachedCriteria) {   
            return (List) getHibernateTemplate().execute(new HibernateCallback() {   
                public Object doInHibernate(Session session) throws HibernateException {   
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
                    return criteria.list();   
                }   
            }, true);   
        }   
      
        public int getCountByCriteria(final DetachedCriteria detachedCriteria) {   
            Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback() {   
                public Object doInHibernate(Session session) throws HibernateException {   
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
                    return criteria.setProjection(Projections.rowCount()).uniqueResult();   
                }   
            }, true);   
            return count.intValue();   
        }   
    }  
    /*
      用户在web层构造查询条件detachedCriteria,和可选的startIndex,调用业务bean的相应findByCriteria方法,返回一个PaginationSupport的实例ps。 ps.getItems()得到已分页好的结果集 
    ps.getIndexes()得到分页索引的数组 
    ps.getTotalCount()得到总结果数 
    ps.getStartIndex()当前分页索引 
    ps.getNextIndex()下一页索引 
    ps.getPreviousIndex()上一页索引 
    */
      

  4.   

    希望有高手为上面的代码加上注释,另外,这个通用类,注意看下面的关键语句,应该满足楼主说的第一条了

    List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); 
      
      

  5.   

    1。其实就是想知道有没有能满足我要求的第三方 
    2。想知道我对eXtremeComponents limit的理解有没有问题 
    3。GT-Grid( ECSide )是否有人用过这个架构这个架构能否实现我的功能