/****************************************************************************** * Copyright (C) 2015 Shenzhen Penguin Network Technology Co., Ltd * All Rights Reserved. * 本软件为深圳企鹅网络科技有限公司开发研制。未经本公司正式书面同意,其他任何个人、团体 * 不得使用、复制、修改或发布本软件. *****************************************************************************/ package com.qxueyou.scc.base.dao; import java.beans.Transient; import java.io.Serializable; import java.math.BigInteger; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.orm.hibernate4.support.HibernateDaoSupport; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.base.model.Result; import org.springframework.transaction.annotation.Transactional; /** * 基础DAO类,自动注入sessionFactory * * @author 夏德虎 * @since JDK1.6 * @history 2010-07-28 夏德虎 新建 */ @Transactional(readOnly=false) public class BaseDAO extends HibernateDaoSupport { /** 注释 rawtypes */ private static final String RAW_TYPES = "rawtypes"; /** * 注入sessionFactory * * @param sessionFactory */ @Autowired(required = false) public void setSessionfactory(SessionFactory sessionFactory) { this.setSessionFactory(sessionFactory); } /** * 读取对象 * * @param 泛型类型 * @param clz VO CLASS类型 * @param key VO 主键 * @return 查找到的结果,如果没找到,返回null */ public T read(Class clz, Serializable key) { if(key==null){ return null; } return clz.cast(this.getHibernateTemplate().get(clz, key)); } /** * 保存对象 */ public void update(Object obj) { this.getHibernateTemplate().update(obj); } /** * 保存对象 */ public void save(Object obj) { this.getHibernateTemplate().save(obj); } /** * 保存或更新对象 */ @Transactional(readOnly = false) public void saveOrUpdate(Object obj) { this.getHibernateTemplate().saveOrUpdate(obj); } /** * 保存或更新集合对象 */ public void saveOrUpdateAll(@SuppressWarnings(RAW_TYPES) Collection collection) { for(Object obj:collection){ this.getHibernateTemplate().saveOrUpdate(obj); } } /** * 保存或更新对象 */ public void deleteAll(@SuppressWarnings(RAW_TYPES) Collection col) { this.getHibernateTemplate().deleteAll(col); } /** * 根据hql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param cls 返回类型 * @return */ @SuppressWarnings("unchecked") public List find(String hql, Class cls) { return find(hql,Collections.EMPTY_LIST,cls); } /** * 根据hql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public List find(final String hql,final List args,final Class cls) { return this.getHibernateTemplate().execute(new HibernateCallback>() { @SuppressWarnings("unchecked") public List doInHibernate(Session session) { Query query = session.createQuery(hql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } query.setFirstResult(0); query.setMaxResults(Integer.MAX_VALUE); return query.list(); } }); } /** * 根据hql查询,并返回执行类型的列表 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings("unchecked") public List findwithRawResult(String hql, List args) { return (List) this.getHibernateTemplate().find(hql, args.toArray()); } /** * 根据hql查询,返回列表数据总数 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public int findCount(final String hql, final List args) { return getHibernateTemplate().execute(new HibernateCallback() { @Override public Integer doInHibernate(Session session){ Query query = session.createQuery(hql.trim().startsWith("from")?"select count(1) ".concat(hql):hql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } if(null != query.uniqueResult()){ return ((Long)query.uniqueResult()).intValue(); }else{ return 0 ; } } }); } /** * 根据hql查询,返回列表数据总数 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public int findCountBySql(final String sql, final List args) { return getHibernateTemplate().execute(new HibernateCallback() { @Override public Integer doInHibernate(Session session){ Query query = session.createSQLQuery(sql.trim().startsWith("from")?"select count(1) ".concat(sql):sql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } if(null != query.uniqueResult()){ return ((BigInteger)query.uniqueResult()).intValue(); }else{ return 0 ; } } }); } /** * 根据hql查询,返回列表分页数据 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({ "unchecked" }) public List findList(final String hql, final Pager page, final List args,Class cls) { return this.getHibernateTemplate().execute(new HibernateCallback>() { public List doInHibernate(Session session) { Query query = session.createQuery(hql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } query.setFirstResult(page.getPageSize()*(page.getPageNum()-1)); query.setMaxResults(page.getPageSize()); return query.list(); } }); } /** * 根据hql查询,返回唯一的数据 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({ RAW_TYPES, "unchecked" }) public T findUnique(final String hql, final List args,Class cls) { return (T)this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) { Query query = session.createQuery(hql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } query.setFirstResult(0); query.setMaxResults(1); List result = query.list(); return result.isEmpty()?null:result.get(0); } }); } /** * 根据hql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({ RAW_TYPES}) public List findBySql(final String sql, final List args) { return this.getHibernateTemplate().execute(new HibernateCallback() { public List doInHibernate(Session session) { SQLQuery query = session.createSQLQuery(sql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } return query.list(); } }); } /** * 根据hql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({ RAW_TYPES}) public List findByPageSql(final String sql, final List args, final Pager pager) { return this.getHibernateTemplate().execute(new HibernateCallback() { public List doInHibernate(Session session) { SQLQuery query = session.createSQLQuery(sql); int i = 0; for (Object arg : args) { query.setParameter(i++, arg); } query.setFirstResult(pager.getPageSize()*(pager.getPageNum()-1)); query.setMaxResults(pager.getPageSize()); return query.list(); } }); } /** * hql只含单一参数 * * @param hql 查询语句 * @param args 参数数组 * @param cls 返回类型 * @return */ public Result bulkUpdateInLoop(String hql, Object args[]) { int iCount = 0; for(Object arg:args){ iCount += getHibernateTemplate().bulkUpdate(hql, arg); } Map attrs = new HashMap(1); attrs.put("doCount", iCount); Result result = new Result(true); result.setData(attrs); return result; } /** * hql只含单一参数 * * @param hql 查询语句 * @param args 参数数组 * @param cls 返回类型 * @return */ public Result bulkUpdate(String hql, Object args[]) { int count = getHibernateTemplate().bulkUpdate(hql, args); Map attrs = new HashMap(1); attrs.put("doCount", count); Result result = new Result(true); result.setData(attrs); return result; } /** * 存储过程语句 * * @param hql call 存储语句 sql语句 * @param args 参数数组 * @return */ public Result executeProduce(final String sql, final Object args[]) { Integer result = getHibernateTemplate().execute(new HibernateCallback(){ @Override public Integer doInHibernate(Session session) throws HibernateException { Query query = session.createSQLQuery("{ "+sql+" }"); for(int i=0;i(){ @Override public Integer doInHibernate(Session session) throws HibernateException { Query query = session.createSQLQuery(sql); for(int i=0;i findRawByComplexHql(final String hql, final Map map) { // 查询结果 return (List)this.getHibernateTemplate().execute(new HibernateCallback() { public List doInHibernate(Session session) { Query query = session.createQuery(hql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ query.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ query.setParameterList(string, (Object[])obj); }else{ query.setParameter(string, obj); } } } return query.list(); } }); } /** * 根据hql查询,返回列表数据总数 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public int findCountByComplexHql(final String hql, final Map map) { return getHibernateTemplate().execute(new HibernateCallback() { @Override public Integer doInHibernate(Session session){ Query queryHql = session.createQuery(hql.trim().startsWith("from")?"select count(1) ".concat(hql):hql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ queryHql.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ queryHql.setParameterList(string, (Object[])obj); }else{ queryHql.setParameter(string, obj); } } } if(null != queryHql.uniqueResult()){ return ((Long)queryHql.uniqueResult()).intValue(); }else{ return 0 ; } } }); } /** * 根据sql查询,返回列表数据总数 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public int findCountByComplexSql(final String hql, final Map map) { return getHibernateTemplate().execute(new HibernateCallback() { @Override public Integer doInHibernate(Session session){ Query querySql = session.createSQLQuery(hql.trim().startsWith("from")?"select count(1) ".concat(hql):hql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ querySql.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ querySql.setParameterList(string, (Object[])obj); }else{ querySql.setParameter(string, obj); } } } if(null != querySql.uniqueResult()){ return ((BigInteger)querySql.uniqueResult()).intValue(); }else{ return 0 ; } } }); } /** * 根据hql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public List findByComplexHql(final String hql, final Map map, Class cls) { Pager page = new Pager(); page.setPageSize(Integer.MAX_VALUE); page.setPageNum(1); return findByComplexHql(hql, page, map, cls); } /** * 复杂hql * @param sql * @param map * @param cls * @return */ public T findUniqueByHql(final String hql, final Map map){ // 查询结果 List lst = this.getHibernateTemplate().execute(new HibernateCallback>() { @SuppressWarnings("unchecked") public List doInHibernate(Session session) { Query queryHql = session.createQuery(hql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ queryHql.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ queryHql.setParameterList(string, (Object[])obj); }else{ queryHql.setParameter(string, obj); } } } queryHql.setFirstResult(0); queryHql.setMaxResults(1); List r = queryHql.list(); List lst = new ArrayList(r.size()); for(Object o:r) { lst.add((T)o); } return lst; } }); return lst.isEmpty()?null:lst.get(0); } /** * 根据hql查询,并返回执行类型的列表结果,列表数据为Map * * @param hql 查询语句 * @param args 参数 * @return */ public List> findListWithMapByHql(final String hql, final Map map) { Pager page = new Pager(); page.setPageNum(1); page.setPageSize(Integer.MAX_VALUE); return findListWithMapByHql(hql,map,page); } /** * 根据hql查询,并返回执行类型的列表结果,列表数据为Map * * @param hql 查询语句 * @param args 参数 * @return */ @SuppressWarnings("unchecked") public List> findListWithMapByHql(final String hql, final Map map,final Pager page) { // 查询结果 List> lst = getHibernateTemplate().execute(new HibernateCallback>>() { public List> doInHibernate(Session session) { Query query = session.createQuery(hql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ query.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ query.setParameterList(string, (Object[])obj); }else{ query.setParameter(string, obj); } } } query.setFirstResult(page.getPageSize()*(page.getPageNum()-1)); query.setMaxResults(page.getPageSize()); return query.list(); } }); return lst; } /** * 根据hql查询,并返回唯一一条结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({RAW_TYPES }) public T findUniqueByComplexHql(final String hql, final Map map, Class cls) { // 查询结果 List lst = this.getHibernateTemplate().execute(new HibernateCallback>() { public List doInHibernate(Session session) { Query query = session.createQuery(hql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ query.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ query.setParameterList(string, (Object[])obj); }else{ query.setParameter(string, obj); } } } query.setFirstResult(0); query.setMaxResults(1); return query.list(); } }); return lst.isEmpty()?null:cls.cast(lst.get(0)); } /** * 根据Sql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ public List findByComplexSql(final String sql, final Map map, Class cls) { Pager page = new Pager(); page.setPageSize(Integer.MAX_VALUE); page.setPageNum(1); return findByComplexSql(sql, page, map, cls); } /** * 根据Sql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({RAW_TYPES, "unchecked" }) public List findRawByComplexSql(final String sql, final Map map) { // 查询结果 return (List)this.getHibernateTemplate().execute(new HibernateCallback() { public List doInHibernate(Session session) { SQLQuery query = session.createSQLQuery(sql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ query.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ query.setParameterList(string, (Object[])obj); }else{ query.setParameter(string, obj); } } } return query.list(); } }); } /** * 根据hql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({RAW_TYPES }) public List findByComplexHql(final String hql,final Pager page, final Map map, Class cls) { // 查询结果 List lst = this.getHibernateTemplate().execute(new HibernateCallback() { public List doInHibernate(Session session) { Query queryHql = session.createQuery(hql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ queryHql.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ queryHql.setParameterList(string, (Object[])obj); }else{ queryHql.setParameter(string, obj); } } } queryHql.setFirstResult(page.getPageSize()*(page.getPageNum()-1)); queryHql.setMaxResults(page.getPageSize()); return queryHql.list(); } }); // 组装结果 List result = new ArrayList(); for (Object obj : lst) { result.add(cls.cast(obj)); } return result; } /** * 根据Sql查询,并返回执行类型的列表结果 * * @param hql 查询语句 * @param args 参数 * @param cls 返回类型 * @return */ @SuppressWarnings({RAW_TYPES }) public List findByComplexSql(final String sql,final Pager page, final Map map, Class cls) { // 查询结果 List lst = this.getHibernateTemplate().execute(new HibernateCallback() { public List doInHibernate(Session session) { SQLQuery querySql = session.createSQLQuery(sql); if (map != null) { Set keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(obj instanceof Collection){ querySql.setParameterList(string, (Collection)obj); }else if(obj instanceof Object[]){ querySql.setParameterList(string, (Object[])obj); }else{ querySql.setParameter(string, obj); } } } querySql.setFirstResult(page.getPageSize()*(page.getPageNum()-1)); querySql.setMaxResults(page.getPageSize()); return querySql.list(); } }); // 组装结果 List result = new ArrayList(); for (Object obj : lst) { result.add(cls.cast(obj)); } return result; } }