抽象业务类 
java 代码
/**  
 * 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()上一页索引
 
转http://www.javaeye.com/topic/14657

解决方案 »

  1.   

    传说中的带Order计算不正确问题没有考虑啊
      

  2.   

    int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
                    criteria.setProjection(null);   
                    List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
    ------------------------------
    要是穿进来的DetachedCritera本身就有 Projection, 被你这么 criteria.setProjection(null);  会咋样?