鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          原文引自:http://forum.javaeye.com/viewtopic.php?t=14657

          Hibernate3提供了DetachedCriteria,使得我們可以在Web層構造detachedCriteria,然后調用業務層Bean,進行動態條件查詢,根據這一功能,我設計了通用的抽象Bean基類和分頁類支持,代碼來自于Quake Wang的javaeye-core包的相應類,然后又做了很多修改。

          分頁支持類:

          java代碼: 


          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;
                  }

          }



          抽象業務類
          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()上一頁索引
          posted on 2006-02-10 08:51 TrampEagle 閱讀(4785) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 西吉县| 桂林市| 专栏| 丰都县| 玉树县| 南涧| 三都| 长子县| 鹿泉市| 合水县| 凤冈县| 龙口市| 东海县| 巴里| 太仆寺旗| 安国市| 理塘县| 宜春市| 玛多县| 永春县| 都兰县| 绥芬河市| 昆明市| 朔州市| 惠东县| 丰原市| 翁源县| 岗巴县| 新平| 太仓市| 满洲里市| 罗山县| 江都市| 建德市| 沧州市| 陵水| 祁阳县| 深圳市| 杨浦区| 芷江| 大竹县|