首页 > 学院 > 开发设计 > 正文

SSH HibernateDaoImpl

2019-11-08 19:33:28
字体:
来源:转载
供稿:网友
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(); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表