BaseDao终极版

来源:互联网 发布:专利公司 知乎 编辑:程序博客网 时间:2024/06/08 03:23
import java.lang.reflect.ParameterizedType;import java.sql.SQLException;import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.annotation.Resource;import net.houder.command.CriteriaCommand;import net.houder.command.FieldCommandImpl;import net.houder.command.QueryFilter;import net.houder.command.SortCommandImpl;import net.houder.common.HDErrorException;import net.houder.paging.PagingBean;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Logger;import org.hibernate.Criteria;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.hibernate.criterion.Criterion;import org.hibernate.criterion.Projections;import org.hibernate.criterion.Restrictions;import org.hibernate.hql.ast.QueryTranslatorImpl;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.HibernateTemplate;public class BaseDao<T> implements AbstractDao<T, Long> {protected transient final Logger logger = Logger.getLogger(getClass());/** * 创建clazz对象,存储转型过来的T */private Class<T> clazz;/** * 创建HibernateTemplate对象 */@Resource(name = "hibernateTemplate")protected HibernateTemplate hibernateTemplate;protected Map<String, String> querys = new HashMap<String, String>();public Map<String, String> getQuerys() {return querys;}public void setQuerys(Map<String, String> querys) {this.querys = querys;}/** * 构造方法,把T转型成指定对象 */@SuppressWarnings("unchecked")public BaseDao() {// 得到被泛型的实体的classclazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];}@Overridepublic void commitTrans() {throw new HDErrorException("未实现!");}@Overridepublic void clear() {hibernateTemplate.clear();}@Overridepublic void evict(T entity) {hibernateTemplate.evict(entity);}public List<T> findByHql(final String hql) {Object objs[] = null;return findByHql(hql, objs);}@SuppressWarnings("unchecked")@Overridepublic List<T> findByHql(final String hql, final Object[] objs) {return (List<T>) hibernateTemplate.execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);if (objs != null) {for (int i = 0; i < objs.length; i++) {query.setParameter(i, objs[i]);}}return (List<T>) query.list();}});}@SuppressWarnings("unchecked")@Overridepublic List findByHql(final String hql, final Map paras) {return (List<T>) hibernateTemplate.execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);query.setProperties(paras);// if (objs != null) {// for (int i = 0; i < objs.length; i++) {// query.setParameter(i, objs[i]);// }// }return (List<T>) query.list();}});}@SuppressWarnings("unchecked")@Overridepublic List<T> findByHql(final String hql, final Object[] objs,final int firstResult, final int pageSize) {return (List<T>) hibernateTemplate.execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);query.setFirstResult(firstResult).setMaxResults(pageSize);if (objs != null) {for (int i = 0; i < objs.length; i++) {query.setParameter(i, objs[i]);}}return (List<T>) query.list();}});}@Overridepublic List<T> findByHql(String hql, Object[] objs, PagingBean pagingBean) {int totalItems = getTotalItems(hql, objs).intValue();pagingBean.setTotalItems(totalItems);return findByHql(hql, objs, pagingBean.getFirstResult(), pagingBean.getPageSize());}@SuppressWarnings("unchecked")public Object findUnique(final String hql, final Object[] values) {return hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);if (values != null) {for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}}return query.uniqueResult();}});}/** * 通过编号找到记录 编号的字段名称必须是"code" *  * @param code *  * @return */public T findByCode(String code) throws HDErrorException {return findByCode("code", code);}/** * 通过唯一键找到记录 *  * @return */public T findByCode(String codefldname, String code)throws HDErrorException {final String codefldname1 = codefldname;final String code1 = code;return (T) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(Restrictions.eq(codefldname1, code1));List<T> list = criteria.list();if (list == null || list.size() < 1) {throw new HDErrorException("未发现记录.唯一字段:" + codefldname1+ ";字段值:" + code1);}if (list.size() > 1) {throw new HDErrorException("发现多条唯一性记录.唯一字段:" + codefldname1+ ";字段值:" + code1);}return list.get(0);}});}public T findByCode(String codefldname, String code, Long systemDeployId)throws HDErrorException {final String codefldname1 = codefldname;final String code1 = code;final Long systemDeployId1 = systemDeployId;return (T) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(Restrictions.eq(codefldname1, code1));criteria.add(Restrictions.eq("systemDeploy.id", systemDeployId1));List<T> list = criteria.list();if (list == null || list.size() < 1) {throw new HDErrorException("未发现记录.唯一字段:" + codefldname1+ ";字段值:" + code1);}if (list.size() > 1) {throw new HDErrorException("发现多条唯一性记录.唯一字段:" + codefldname1+ ";字段值:" + code1);}return list.get(0);}});}public T findByVersionId(String codefldname, Long verId, Long systemDeployId)throws HDErrorException {final String codefldname1 = codefldname;final Long verId1 = verId;final Long systemDeployId1 = systemDeployId;return (T) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(Restrictions.eq(codefldname1, verId1));criteria.add(Restrictions.eq("systemDeploy.id", systemDeployId1));List<T> list = criteria.list();if (list != null && list.size() > 0) {return list.get(0);} else {return null;}}});}/** * 通过字段和id找到实体 *  * @return */public T findByCode(Long id, String codefldname, String code,Long systemDeployId) throws HDErrorException {final String codefldname1 = codefldname;final String code1 = code;final Long id1 = id;final Long systemDeployId1 = systemDeployId;return (T) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(Restrictions.eq(codefldname1, code1));criteria.add(Restrictions.isNotNull(codefldname1));// criteria.add(Restrictions.not(Restrictions.eq(codefldname1,// "")));if (systemDeployId1 != -1) {criteria.add(Restrictions.eq("systemDeploy.id",systemDeployId1));}if (id1 != null && id1 != 0) {criteria.add(Restrictions.not(Restrictions.eq("id", id1)));}List<T> list = criteria.list();if (list.size() == 0)return null;elsereturn list.get(0);}});}public T findValidByCode(Long id, String codefldname, String code,Long systemDeployId) throws HDErrorException {final String codefldname1 = codefldname;final String code1 = code;final Long id1 = id;final Long systemDeployId1 = systemDeployId;return (T) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(Restrictions.eq(codefldname1, code1));criteria.add(Restrictions.isNotNull(codefldname1));criteria.add(Restrictions.eq("valid", 1L));// criteria.add(Restrictions.not(Restrictions.eq(codefldname1,// "")));if (systemDeployId1 != -1) {criteria.add(Restrictions.eq("systemDeploy.id",systemDeployId1));}if (id1 != null && id1 != 0) {criteria.add(Restrictions.not(Restrictions.eq("id", id1)));}List<T> list = criteria.list();if (list.size() == 0)return null;elsereturn list.get(0);}});}@Overridepublic void flush() {hibernateTemplate.flush();}@Overridepublic T get(Long id) {return hibernateTemplate.get(clazz, id);}@Overridepublic List<T> getAll() {return hibernateTemplate.loadAll(clazz);}public List<T> getAllBySystemDeployId(Long systemDeployId) {Criterion criterion = Restrictions.eq("systemDeploy.id", systemDeployId);return getAll(criterion);}@SuppressWarnings("unchecked")@Overridepublic List<T> getAll(final Criterion orgCriterion) {return (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(orgCriterion);return (List<T>) criteria.list();}});}@SuppressWarnings("unchecked")@Overridepublic List<T> getAll(final Criterion orgCriterion,final PagingBean pagingBean) {final String hql = "from " + clazz.getName();int totalItems = this.getTotalItems(orgCriterion).intValue();pagingBean.setTotalItems(totalItems);return (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);query.setFirstResult(pagingBean.getFirstResult()).setFetchSize(pagingBean.getPageSize());query.setMaxResults(pagingBean.getPageSize());return (List<T>) query.list();}});}@SuppressWarnings("unchecked")@Overridepublic List<T> getAll(final Criterion orgCriterion,final QueryFilter queryFilter) {int totalCounts = getCountByFilter(queryFilter);// 设置总记录数queryFilter.getPagingBean().setTotalItems(totalCounts);return (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(orgCriterion);// 重新清除alias的命名,防止计算记录行数后名称还存在该处queryFilter.getAliasSet().clear();setCriteriaByQueryFilter(criteria, queryFilter);return (List<T>) criteria.list();}});}@SuppressWarnings("unchecked")@Overridepublic List<T> getAll(final PagingBean pagingBean) {final String hql = "from " + clazz.getName();int totalItems = getTotalItems(hql, null).intValue();pagingBean.setTotalItems(totalItems);return (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);query.setFirstResult(pagingBean.getFirstResult()).setFetchSize(pagingBean.getPageSize());query.setMaxResults(pagingBean.getPageSize());return (List<T>) query.list();}});}/** * 无分页全查 */@SuppressWarnings("unchecked")@Overridepublic List<T> getAllNoPaging(final QueryFilter queryFilter) {return (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);// 重新清除alias的命名,防止计算记录行数后名称还存在该处queryFilter.getAliasSet().clear();for (int i = 0; i < queryFilter.getCommands().size(); i++) {criteria = queryFilter.getCommands().get(i).execute(criteria);}return criteria.list();}});}@SuppressWarnings("unchecked")@Overridepublic List<T> getAll(final QueryFilter queryFilter) {if (StringUtils.isNotEmpty(queryFilter.getFilterName())) {return getAll2(queryFilter);}int totalCounts = getCountByFilter(queryFilter);// 设置总记录数queryFilter.getPagingBean().setTotalItems(totalCounts);return (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);// 重新清除alias的命名,防止计算记录行数后名称还存在该处queryFilter.getAliasSet().clear();setCriteriaByQueryFilter(criteria, queryFilter);return criteria.list();}});}/** * 按Hql查询并返回 *  * @param queryFilter * @param hql * @param params * @return */public List getAll2(QueryFilter queryFilter) {String hql = querys.get(queryFilter.getFilterName()).trim();String newHql = null;String condition = null;String groupBy = null;// 重新设置排序int orderIndex = hql.toUpperCase().indexOf(" ORDER BY ");int whereIndex = hql.toUpperCase().indexOf(" WHERE ");if (orderIndex < 0) {orderIndex = hql.length();}if (whereIndex < 0) {whereIndex = hql.length();}if (whereIndex < 0) {condition = " where 1=1 ";} else {condition = hql.substring(whereIndex + 7, orderIndex);logger.debug("condition:" + condition);Pattern groupByPattern = Pattern.compile(" GROUP BY [\\w|.]+");Matcher m = groupByPattern.matcher(condition.toUpperCase());// 存在Group Byif (m.find()) {groupBy = condition.substring(m.start(), m.end());condition = condition.replace(groupBy, " ");}condition = " where (" + condition + ")";}String sortDesc = "";// 取得条件以及排序for (int i = 0; i < queryFilter.getCommands().size(); i++) {CriteriaCommand command = queryFilter.getCommands().get(i);if (command instanceof FieldCommandImpl) {condition += " and "+ ((FieldCommandImpl) command).getPartHql();} else if (command instanceof SortCommandImpl) {if (!"".equals(sortDesc)) {sortDesc += ",";}sortDesc += ((SortCommandImpl) command).getPartHql();}}newHql = hql.substring(0, whereIndex);if (queryFilter.getAliasSet().size() > 0) {// 取得hql中的表的别名,为关联外表作准备int fromIndex = newHql.indexOf(" FROM ");String entityAliasName = null;if (fromIndex > 0) {String afterFrom = newHql.substring(fromIndex + 6);String[] keys = afterFrom.split("[ ]");if (keys.length > 1) {if (!keys[1].toUpperCase().equals("ORDER")&& !keys[1].toUpperCase().equals("JOIN")) {entityAliasName = keys[1];}}// 加上别名if (entityAliasName == null) {entityAliasName = "vo";newHql = newHql.replace(keys[0], keys[0] + " "+ entityAliasName);}}// 若存在外键,则进行组合String joinHql = "";Iterator it = queryFilter.getAliasSet().iterator();while (it.hasNext()) {String joinVo = (String) it.next();joinHql += " join " + entityAliasName + "." + joinVo + " "+ joinVo;}// 加上外键的联接if (!"".equals(joinHql)) {newHql += joinHql;}}// 加上条件限制newHql += condition;// 加上分组if (groupBy != null) {newHql += groupBy + " ";}// 加上排序if (!"".equals(sortDesc)) {// 带在排序在内newHql += " order by vo." + sortDesc;} else {newHql += hql.substring(orderIndex);}Object[] params = queryFilter.getParamValueList().toArray();if (queryFilter.getPagingBean() != null) {// 显示多少条记录int totalItems = getTotalItems(newHql, params).intValue();queryFilter.getPagingBean().setTotalItems(totalItems);if (logger.isDebugEnabled()) {logger.debug("new hql:" + newHql);}return findByHql(newHql, params, queryFilter.getPagingBean().getFirstResult(), queryFilter.getPagingBean().getPageSize());}return findByHql(newHql, params);}@SuppressWarnings("unchecked")public int getCountByFilter(final Criterion orgCriterion,final QueryFilter filter) {Integer count = (Integer) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(orgCriterion);for (int i = 0; i < filter.getCommands().size(); i++) {CriteriaCommand command = filter.getCommands().get(i);if (!(command instanceof SortCommandImpl)) {criteria = command.execute(criteria);}}criteria.setProjection(Projections.rowCount());return criteria.uniqueResult();}});if (count == null)return new Integer(0);return count.intValue();}@SuppressWarnings("unchecked")public int getCountByFilter(final QueryFilter filter) {Integer count = (Integer) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);for (int i = 0; i < filter.getCommands().size(); i++) {CriteriaCommand command = filter.getCommands().get(i);if (!(command instanceof SortCommandImpl)) {criteria = command.execute(criteria);}}criteria.setProjection(Projections.rowCount());return criteria.uniqueResult();}});if (count == null)return new Integer(0);return count.intValue();}@SuppressWarnings("unchecked")public Long getTotalItems() {final String sql = "select count(*) from " + clazz.getName()+ " tmp_count_t";Object reVal = hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {SQLQuery query = session.createSQLQuery(sql);return query.uniqueResult();}});return new Long(reVal.toString());}@SuppressWarnings("unchecked")public Long getTotalItems(final Criterion orgCriterion) {Integer count = (Integer) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Criteria criteria = session.createCriteria(clazz);criteria.add(orgCriterion);criteria.setProjection(Projections.rowCount());return criteria.uniqueResult();}});if (count == null)return new Long(0l);return new Long(count.intValue());}@SuppressWarnings("unchecked")public Long getTotalItems(String queryString, final Object[] values) {int orderByIndex = queryString.toUpperCase().indexOf(" ORDER BY ");if (orderByIndex != -1) {queryString = queryString.substring(0, orderByIndex);}QueryTranslatorImpl queryTranslator = new QueryTranslatorImpl(queryString,queryString,Collections.EMPTY_MAP,(org.hibernate.engine.SessionFactoryImplementor) hibernateTemplate.getSessionFactory());queryTranslator.compile(java.util.Collections.EMPTY_MAP, false);final String sql = "select count(*) from ("+ queryTranslator.getSQLString() + ") tmp_count_t";Object reVal = hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {SQLQuery query = session.createSQLQuery(sql);if (values != null) {for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}}return query.uniqueResult();}});return new Long(reVal.toString());}@Overridepublic T merge(T entity) {return hibernateTemplate.merge(entity);}@Overridepublic void refresh(Object obj) {hibernateTemplate.flush();}@Overridepublic void remove(Long id) {hibernateTemplate.delete(get(id));}@Overridepublic void remove(T entity) {hibernateTemplate.delete(entity);}@Overridepublic T insert(T entity) {hibernateTemplate.save(entity);return entity;}@Overridepublic T save(T entity) {// try{////// BeanWrapper bw = new BeanWrapperImpl(entity);// Object id = bw.getPropertyDescriptor("id");// if(id==null){//// }else{//// }////// bw.setPropertyValue("", );//// }catch(Exception e){// e.printStackTrace();// }hibernateTemplate.saveOrUpdate(entity);return entity;}@Overridepublic T add(T entity) {hibernateTemplate.save(entity);return entity;}protected Criteria setCriteriaByQueryFilter(Criteria criteria,QueryFilter filter) {for (int i = 0; i < filter.getCommands().size(); i++) {criteria = filter.getCommands().get(i).execute(criteria);}criteria.setFirstResult(filter.getPagingBean().getFirstResult());criteria.setMaxResults(filter.getPagingBean().getPageSize());return criteria;}@Overridepublic T update(T entity) {hibernateTemplate.update(entity);return entity;}@SuppressWarnings("unchecked")@Overridepublic void removeByPropertyAndValue(final String propertyName,final String value) {hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(new StringBuffer().append("delete from ").append(clazz.getSimpleName()).append(" o where o.").append(propertyName).append(" = ").append("'").append(value).append("'").toString());query.executeUpdate();return null;}});}/** * 通过某一列进行全部删除 *  * @param propertyName * @param value */@SuppressWarnings("unchecked")public void deleteByProperty(final String propertyName, final Object value) {hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(new StringBuffer().append("delete from ").append(clazz.getSimpleName()).append(" o where o.").append(propertyName).append(" = ").append("'").append(value).append("'").toString());query.executeUpdate();return null;}});}/** * 执行hql语句,适用于update,delete */@Overridepublic void executeHql(String hql) {Object objs[] = null;executeHql(hql, objs);}/** * 执行hql语句,适用于update,delete */@Override@SuppressWarnings("unchecked")public void executeHql(final String hql, final Object[] objs) {hibernateTemplate.execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(hql);if (objs != null) {for (int i = 0; i < objs.length; i++) {query.setParameter(i, objs[i]);}}query.executeUpdate();return null;}});}/** * 执行sql语句,适用于update,delete */@Overridepublic void executeSql(String sql) {Object objs[] = null;executeSql(sql, objs);}/** * 执行sql语句,适用于update,delete */@Override@SuppressWarnings("unchecked")public void executeSql(final String sql, final Object[] objs) {hibernateTemplate.execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createSQLQuery(sql);if (objs != null) {for (int i = 0; i < objs.length; i++) {query.setParameter(i, objs[i]);}}query.executeUpdate();return null;}});}}


0 0
原创粉丝点击