/** * Copyright (c) http://www.hao-se.cn Ltd.,2007 All rights reserved. */ package com.joe.utilities.core.hibernate.entrydao.impl; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.hibernate.criterion.CriteriaSpecification; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.impl.CriteriaImpl; import org.hibernate.impl.CriteriaImpl.OrderEntry; import org.springframework.util.Assert; import com.joe.utilities.common.util.Page; import com.joe.utilities.core.hibernate.entrydao.BaseEntityDAO; /** * 泛型实体DAO * * */ public class BaseEntityDAOImpl<T> extends BaseGenericDAO<T> implements BaseEntityDAO<T> { /** * spring配置中通过构造函数注射入具体类 * * @param type */ public BaseEntityDAOImpl(Class<T> type) { super(type); this.type = type; } /** * 取得Entity的Criteria. */ protected DetachedCriteria getEntityDetachedCriteria() { return DetachedCriteria.forClass(type); } /* * @see cn.haose.dao.BaseEntityDAO#findBy(java.lang.String,java.lang.Object) */ @SuppressWarnings("unchecked") public List<T> findBy(String name, Object value) { Assert.hasText(name); DetachedCriteria dc = getEntityDetachedCriteria(); if (value == null) { dc.add((Restrictions.isNull(name))); } else { dc.add(Restrictions.eq(name, value)); } return (List<T>) getHibernateTemplate().findByCriteria(dc); } /* * @see cn.haose.dao.BaseEntityDAO#pagedQuery(org.hibernate.criterion.DetachedCriteria,int,int) */ @SuppressWarnings("unchecked") public Page pagedQuery(final DetachedCriteria dc, int pageNo, int pageSize) { Assert.notNull(dc, "DetachedCriteria must not be null"); CriteriaImpl c = (CriteriaImpl) dc.getExecutableCriteria(getSession()); // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作 Projection projection = c.getProjection(); List<OrderEntry> orderEntries; Field field = null; boolean accessible = false; try { field = c.getClass().getDeclaredField("orderEntries"); accessible = field.isAccessible(); field.setAccessible(true); orderEntries = (List<OrderEntry>) field.get(c); field.set(c, new ArrayList()); field.setAccessible(accessible); } catch (Exception e) { logger.error("BaseGenericDAO.findByCriteria方法中获得CriteriaImpl属性值时出错"); throw new RuntimeException("服务器繁忙!"); } int totalRow = ((Integer) c.setProjection(Projections.rowCount()) .uniqueResult()).intValue(); // 返回分页对象 if (totalRow < 1) { return new Page(); } // 将之前的Projection和OrderBy条件重新设回去 c.setProjection(projection); if (projection == null) { c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } try { field.setAccessible(true); field.set(c, orderEntries); field.setAccessible(accessible); } catch (Exception e) { logger.error("BaseGenericDAO.findByCriteria方法中设置CriteriaImpl属性值时出错"); throw new RuntimeException("服务器繁忙!"); } int startIndex = Page.getStartOfPage(pageNo, pageSize); List list = c.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Page(startIndex, totalRow, pageSize, list); } }