Package org.beangle.model.persist.hibernate

Source Code of org.beangle.model.persist.hibernate.BaseDaoHibernate

/* Copyright c 2005-2012.
* Licensed under GNU  LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*/
package org.beangle.model.persist.hibernate;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.beangle.commons.collection.page.Page;
import org.beangle.commons.collection.page.PageLimit;
import org.beangle.commons.collection.page.SinglePage;
import org.beangle.model.persist.EntityDao;
import org.beangle.model.persist.hibernate.HibernateEntityDao.QuerySupport;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.impl.CriteriaImpl;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public abstract class BaseDaoHibernate extends HibernateDaoSupport {

  protected EntityDao entityDao;

  public void setEntityDao(EntityDao entityDao) {
    this.entityDao = entityDao;
  }

  @SuppressWarnings("unchecked")
  public <T> Page<T> paginateCriteria(Criteria criteria, PageLimit limit) {
    CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
    int totalCount = 0;
    List<T> targetList = null;
    if (null == criteriaImpl.getProjection()) {
      criteria.setFirstResult((limit.getPageNo() - 1) * limit.getPageSize()).setMaxResults(
          limit.getPageSize());
      targetList = criteria.list();
      Projection projection = null;
      criteria.setFirstResult(0).setMaxResults(1);
      projection = Projections.rowCount();
      totalCount = ((Integer) criteria.setProjection(projection).uniqueResult()).intValue();
    } else {
      List<T> list = criteria.list();
      totalCount = list.size();
      criteria.setFirstResult((limit.getPageNo() - 1) * limit.getPageSize()).setMaxResults(
          limit.getPageSize());
      targetList = criteria.list();
    }
    // 返回结果
    return new SinglePage<T>(limit.getPageNo(), limit.getPageSize(), totalCount, targetList);
  }

  /**
   * @param query
   * @param names
   * @param values
   * @param pageNo
   * @param pageSize
   * @return
   */
  @SuppressWarnings("unchecked")
  public <T> Page<T> paginateQuery(Query query, Map<String,Object> params, PageLimit limit) {
    QuerySupport.setParameter(query, params);
    query.setFirstResult((limit.getPageNo() - 1) * limit.getPageSize()).setMaxResults(
        limit.getPageSize());
    List<T> targetList = query.list();

    String queryStr = buildCountQueryStr(query);
    Query countQuery = null;
    if (query instanceof SQLQuery) {
      countQuery = getSession().createSQLQuery(queryStr);
    } else {
      countQuery = getSession().createQuery(queryStr);
    }
    QuerySupport.setParameter(countQuery, params);
    // 返回结果
    return new SinglePage<T>(limit.getPageNo(), limit.getPageSize(), ((Number) (countQuery
        .uniqueResult())).intValue(), targetList);
  }

  /**
   * 构造查询记录数目的查询字符串
   *
   * @param query
   * @return
   */
  private String buildCountQueryStr(Query query) {
    String queryStr = "select count(*) ";
    if (query instanceof SQLQuery) {
      queryStr += "from (" + query.getQueryString() + ")";
    } else {
      String lowerCaseQueryStr = query.getQueryString().toLowerCase();
      String selectWhich = lowerCaseQueryStr.substring(0, query.getQueryString().indexOf(
          "from"));
      int indexOfDistinct = selectWhich.indexOf("distinct");
      int indexOfFrom = lowerCaseQueryStr.indexOf("from");
      // 如果含有distinct
      if (-1 != indexOfDistinct) {
        if (StringUtils.contains(selectWhich, ",")) {
          queryStr = "select count("
              + query.getQueryString().substring(indexOfDistinct,
                  query.getQueryString().indexOf(",")) + ")";

        } else {
          queryStr = "select count("
              + query.getQueryString().substring(indexOfDistinct, indexOfFrom) + ")";
        }
      }
      queryStr += query.getQueryString().substring(indexOfFrom);
    }
    return queryStr;
  }
}
TOP

Related Classes of org.beangle.model.persist.hibernate.BaseDaoHibernate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.