zoukankan      html  css  js  c++  java
  • 【转】HibernateDaoImpl

    原文链接:https://www.javatt.com/p/96866

    package com.oa.common.hibernate;
    
    import java.io.Serializable;
    import java.sql.SQLException;
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    
    import org.hibernate.Criteria;
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    import org.hibernate.criterion.CriteriaSpecification;
    import org.hibernate.criterion.Criterion;
    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.oa.common.utils.PageParam;
    import com.oa.common.utils.PageUtil;
    import com.oa.common.utils.StringUtil;
    
    /**
     * 扩展HibernateDaoSupport的泛型基类
     * 
     * @param <T>
     *            实体类型
     */
    @SuppressWarnings("all")
    public class HibernateDaoImpl extends HibernateDaoSupport implements HibernateDao {
    
        /**
         * 删除对象
         * 
         * @param entity
         *            实体类
         */
        @Override
        public void delete(final Object entity) {
            getSession().delete(entity);
        }
    
        /**
         * 根据实体类与ID删除对象
         * 
         * @param clazz
         *            实体类
         * @param id
         *            主键ID
         */
        @Override
        public void delete(final Class<?> clazz, final Serializable id) {
            delete(get(clazz, id));
        }
    
        /**
         * 获取所有数据
         * 
         * @param entityClass
         *            参数T的反射类型
         */
        @Override
        public <X> List<X> getAll(final Class<X> entityClass) {
            return createCriteria(entityClass).list();
        }
    
        @Override
        public void save(Object transientInstance) {
            getHibernateTemplate().save(transientInstance);
        }
    
        @Override
        public void saveOrUpdate(Object transientInstance) {
            getHibernateTemplate().saveOrUpdate(transientInstance);
        }
    
        @Override
        public void update(Object transientInstance) {
            getHibernateTemplate().update(transientInstance);
        }
    
        @Override
        public Object merge(Object transientInstance) {
            return getHibernateTemplate().merge(transientInstance);
        }
    
        private boolean isNull(Serializable id) {
            if (id == null || id.toString().trim().length() < 1)
                return true;
            if (("Long".equals(id.getClass().getSimpleName()) || "Integer".equals(id.getClass().getSimpleName())) && Long.valueOf(id.toString()) == 0) {
                return true;
            }
            return false;
        }
    
        /**
         * 根据实体类与ID获得对象
         * 
         * @param clazz
         *            实体类
         * @param id
         *            主键ID
         */
        @Override
        public <T> T load(Class<T> entityClass, Serializable id) {
            if (isNull(id))
                return null;
            return (T) getHibernateTemplate().load(entityClass, id);
        }
    
        /**
         * 根据实体类与ID获得对象
         * 
         * @param clazz
         *            实体类
         * @param id
         *            主键ID
         */
        @Override
        public <T> T get(Class<T> entityClass, Serializable id) {
            if (isNull(id))
                return null;
            return (T) getHibernateTemplate().get(entityClass, id);
        }
    
        /**
         * HQL方式查询(不建议使用)
         * 
         * @param hql
         *            符合HQL语法的查询语句
         * @param values
         *            数量可变的条件值,按顺序绑定
         */
        public <T> List<T> queryByHQL(final String hql, final Object... values) {
            Query query = getSession().createQuery(hql);
            if (values != null) {
                for (int i = 0; i < values.length; i++) {
                    query.setParameter(i, values[i]);
                }
            }
            return (List<T>) query.list();
        }
    
        /**
         * HQL方式查询(建议使用)
         * 
         * @param hql
         *            符合HQL语法的查询语句
         * @param values
         */
        public <T> List<T> queryByHQL(final String hql, final Map<String, Object> params) {
            Query query = getSession().createQuery(hql);
            if (params != null && !params.isEmpty()) {
                for (String key : params.keySet()) {
                    query.setParameter(key, params.get(key));
                }
            }
            return (List<T>) query.list();
        }
    
        /**
         * SQL方式查询
         * 
         * @param sql
         *            符合SQL语法的查询语句
         * @param values
         *            数量可变的条件值,按顺序绑定
         */
        public <T> List<T> queryBySQL(final Class<T> clazz, final String sql, final Object... values) {
            SQLQuery query = getSession().createSQLQuery(sql);
            if (values != null) {
                for (int i = 0; i < values.length; i++) {
                    query.setParameter(i, values[i]);
                }
            }
            return (List<T>) query.addEntity(clazz).list();
        }
    
        /**
         * 根据类型创建查询对象
         * 
         * @param clazz
         *            类型
         */
        public Criteria createCriteria(final Class clazz) {
            return getSession().createCriteria(clazz);
        }
    
        /**
         * 对象化查询
         * 
         * @param entityClass
         *            参数T的反射类型
         * @param criterions
         *            数量可变的Criterion
         */
        public Criteria createCriteria(final Class clazz, final Criterion... criterions) {
            Criteria criteria = getSession().createCriteria(clazz);
            for (Criterion c : criterions) {
                criteria.add(c);
            }
            return criteria;
        }
    
        public <T> List<T> findByCriteria(final DetachedCriteria detachedCriteria) {
            return (List) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException {
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
                    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
                    return criteria.list();
                }
            });
        }
    
        // 用于分页处理
        public <T> List<T> findByCriteria(final DetachedCriteria detachedCriteria, final int pageSize, final int currentPage) {
            // 返回记录总数
            int total = this.findRowCountByCriteria(detachedCriteria);
            return (List) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException {
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
                    if (pageSize > 0) {
                        criteria.setMaxResults(pageSize);
                    }
    
                    if (currentPage > 0) {
                        criteria.setFirstResult(currentPage);
                    }
                    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
                    return criteria.list();
                }
            });
        }
    
        // 用于分页处理
        public List findByCriteriaPage(final DetachedCriteria detachedCriteria, final int pageSize, final int currentPage) {
            return (List) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException {
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
                    if (pageSize > 0) {
                        criteria.setFirstResult((currentPage - 1) * pageSize);
                        criteria.setMaxResults(pageSize);
                    }
                    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
                    return criteria.list();
                }
            });
        }
    
        @Override
        public <T> T findOne(final String hql, final Object... params) {
            return (T) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query hqlQuery = session.createQuery(hql);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            hqlQuery.setParameter(i, params[i]);
                        }
                    }
                    return hqlQuery.setMaxResults(1).uniqueResult();
                }
            });
        }
    
        public <T> T findOneCache(final String hql, final Object... params) {
            return (T) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query hqlQuery = session.createQuery(hql).setCacheable(true);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            hqlQuery.setParameter(i, params[i]);
                        }
                    }
                    return hqlQuery.setMaxResults(1).uniqueResult();
                }
            });
        }
    
        @Override
        public <T> T findOneSql(final String sql, final Class<T> entityClass, final Object... params) {
            return (T) getHibernateTemplate().execute(new HibernateCallback() {
                @Override
                public Object doInHibernate(Session arg0) throws HibernateException, SQLException {
                    SQLQuery sqlQuery = arg0.createSQLQuery(sql);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            sqlQuery.setParameter(i, params[i]);
                        }
                    }
                    if (entityClass != null) {
                        if (Map.class.getName().equals(entityClass.getName())) {
                            sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
                        } else {
                            sqlQuery.addEntity(entityClass);
                        }
                    }
                    return sqlQuery.setMaxResults(1).uniqueResult();
                }
            });
        }
    
        @Override
        public <T> List<T> findBySql(final String sql, final Class<T> entityClass, final Object... params) {
            return getHibernateTemplate().executeFind(new HibernateCallback() {
                public Object doInHibernate(Session arg0) throws HibernateException, SQLException {
                    SQLQuery sqlQuery = arg0.createSQLQuery(sql);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            sqlQuery.setParameter(i, params[i]);
                        }
                    }
                    if (entityClass != null) {
                        if (Map.class.getName().equals(entityClass.getName())) {
                            sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
                        } else {
                            sqlQuery.addEntity(entityClass);
                        }
                    }
                    return sqlQuery.list();
                }
            });
        }
    
        public int findRowCountByCriteria(final DetachedCriteria detachedCriteria) {
            return ((Integer) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException {
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
                    Integer totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
                    criteria.setProjection(null);
                    return Integer.valueOf((totalCount == null) ? 0 : totalCount.intValue());
                }
            })).intValue();
        }
    
        public <T> List<T> findByProjectionDetachedCriteria(final DetachedCriteria detachedCriteria) {
            return (List) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException {
                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
                    criteria.setResultTransformer(CriteriaSpecification.PROJECTION);
                    return criteria.list();
                }
            });
        }
    
        @Override
        public <E> void deleteCollection(Collection<E> objs) {
            getHibernateTemplate().deleteAll(objs);
        }
    
        @Override
        public Integer executeSql(final String sql, final Object... params) {
            return (Integer) getHibernateTemplate().execute(new HibernateCallback() {
    
                @Override
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query query = session.createSQLQuery(sql);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            query.setParameter(i, params[i]);
                        }
                    }
                    return query.executeUpdate();
                }
            });
        }
    
        @Override
        public <T> List<T> exeHqlList(String hql, int pageSize, int currentPage) {
            Query query = getSession().createQuery(hql);
            if (pageSize > 0) {
                query.setFirstResult((currentPage - 1) * pageSize);
                query.setMaxResults(pageSize);
            }
            query.setCacheable(true);
            return query.list();
        }
    
        @Override
        public <E> void saveOrUpdate(Collection<E> objs) {
            getHibernateTemplate().saveOrUpdateAll(objs);
        }
    
        @Override
        public void updateHqlQuery(String hql) {
            Query query = getSession().createQuery(hql);
            query.setCacheable(true);
            query.executeUpdate();
        }
    
        @Override
        public <X> List<X> findByHql(String hql, Object... params) {
            return (List<X>) getHibernateTemplate().find(hql, params);
        }
    
        @Override
        public <T> T execute(final String hql, final Object... params) {
            return (T) getHibernateTemplate().execute(new HibernateCallback() {
                @Override
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query query = session.createQuery(hql);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            query.setParameter(i, params[i]);
                        }
                    }
                    return query.executeUpdate();
                }
            });
        }
    
        @Override
        public List findPageBySql(final String sql, final Map<String, Object> sqlParamMap) {
            final PageParam pageParam = PageUtil.getPageParam();
            // 计算总算
            if (!StringUtil.required(pageParam.getTotalSql())) {
                int index = PageUtil.indexOf(sql.toLowerCase(), " from ");
                int endIndex = PageUtil.indexOf(sql.toLowerCase(), " order ");
                if (endIndex == -1) {
                    endIndex = sql.length();
                }
                pageParam.setTotalSql("select count(*) " + sql.substring(index, endIndex));
            }
            pageParam.setTotalRow((Integer) this.getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query query = session.createSQLQuery(pageParam.getTotalSql());
                    if (sqlParamMap != null && sqlParamMap.size() > 0) {
                        query.setProperties(sqlParamMap);
                    }
                    return StringUtil.toInt(query.setProperties(sqlParamMap).uniqueResult());
                }
            }));
            // 分页数据
            return this.getHibernateTemplate().executeFind(new HibernateCallback() {
                @Override
                public List doInHibernate(Session session) throws HibernateException, SQLException {
                    SQLQuery query = session.createSQLQuery(pageParam.getOrderBy(sql));
                    if (sqlParamMap != null && sqlParamMap.size() > 0) {
                        query.setProperties(sqlParamMap);
                    }
                    if (pageParam.getEntityClass() != null) {
                        query.addEntity(pageParam.getEntityClass());
                    } else {
                        // 预设为MAP
                        query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
                    }
                    return query.setFirstResult(pageParam.getCurrRowNum()).setMaxResults(pageParam.getPageSize()).list();
                }
            });
        }
    
        @Override
        public List findPageByHql(final String hql, final Object... conditions) {
            final PageParam pageParam = PageUtil.getPageParam();
            // 计算总算
            int total = 0;
    
            int index = -1;
            if (hql.matches("(?i)^\s*select\b.*")) {
                index = hql.toLowerCase().indexOf(" from ");
            }
            int endIndex = hql.toLowerCase().lastIndexOf(" order ");
            if (index == -1) {
                index = 0;
            }
            if (endIndex == -1) {
                endIndex = hql.length();
            }
            List l = this.getHibernateTemplate().find("select count(*) " + hql.substring(index, endIndex).replaceAll("\bfetch\b", ""), conditions);
            if (l != null && l.size() > 0) {
                total = StringUtil.toInt(l.get(0));
            }
            pageParam.setTotalRow(total);
            // 分页数据
            return this.getHibernateTemplate().executeFind(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query query = session.createQuery(pageParam.getOrderBy(hql));
                    if (conditions != null && conditions.length > 0) {
                        for (int i = conditions.length - 1; i >= 0; i--) {
                            query.setParameter(i, conditions[i]);
                        }
                    }
                    return query.setFirstResult(pageParam.getCurrRowNum()).setMaxResults(pageParam.getPageSize()).list();
                }
            });
        }
    
        @Override
        public <X> List<X> findByHqlCache(final String hql, final Object... params) {
            return getHibernateTemplate().executeFind(new HibernateCallback() {
                @Override
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query hqlQuery = session.createQuery(hql).setCacheable(true);
                    if (params != null) {
                        for (int i = 0; i < params.length; i++) {
                            hqlQuery.setParameter(i, params[i]);
                        }
                    }
                    return hqlQuery.list();
                }
            });
        }
    
        @Override
        public void executeLocalSql(String sql) {
            getSession().createSQLQuery(sql).executeUpdate();
        }
    }
  • 相关阅读:
    Hive 使用问题集锦
    scala def/val/lazy val区别以及call-by-name和call-by-value
    spark学习流程
    Hadoop
    Hive
    Chrome快捷键
    Java API帮助文档
    Java 访问修饰符与非访问修饰符
    java 关键字
    Solr配置Ikanalyzer分词器
  • 原文地址:https://www.cnblogs.com/binzhou75/p/13689272.html
Copyright © 2011-2022 走看看