/****************************************************************************** * Copyright (C) 2015 Shenzhen Penguin Network Technology Co., Ltd * All Rights Reserved. * ±¾Èí¼þΪÉîÛÚÆó¶ìÍøÂç¿Æ¼¼ÓÐÏÞ¹«Ë¾¿ª·¢ÑÐÖÆ¡£Î´¾­±¾¹«Ë¾ÕýʽÊéÃæÍ¬Ò⣬ÆäËûÈκθöÈË¡¢ÍÅÌå * ²»µÃʹÓᢸ´ÖÆ¡¢Ð޸Ļò·¢²¼±¾Èí¼þ. *****************************************************************************/ package com.qxueyou.scc.base.dao; 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; /** * »ù´¡DAOÀà,×Ô¶¯×¢ÈësessionFactory * * @author Ïĵ»¢ * @since JDK1.6 * @history 2010-07-28 Ïĵ»¢ н¨ */ 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); } /** * ±£´æ»ò¸üжÔÏó */ 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; } }