SSH HibernateDaoImpl

来源:互联网 发布:淘宝代销下单怎么处理 编辑:程序博客网 时间:2024/05/26 22:09
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();    }}
0 0
原创粉丝点击