All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.easyproject.easycommons.commondao.CommonDAOSpringImpl Maven / Gradle / Ivy

package cn.easyproject.easycommons.commondao;


import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.jdbc.Work;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import cn.easyproject.easycommons.commondao.util.EasyCriteria;
import cn.easyproject.easycommons.commondao.util.PageBean;
import cn.easyproject.easycommons.commondao.factory.HibernateSessionFactory;

/**
 * Hibernat5 CommonDAO implement used spring.
 * @author Ray
 * @author [email protected]
 * @author easyproject.cn
 * @since 1.0.0
 * 
 */
@Repository("commonDAO")
@SuppressWarnings({ "rawtypes", "unchecked" })
public class CommonDAOSpringImpl extends HibernateDaoSupport implements CommonDAO {
	
	@Resource
	private SessionFactory mySessionFacotry;

	@PostConstruct
	public void injectSessionFactory() {
		super.setSessionFactory(mySessionFacotry);
	}

	@Override
	public void batchUpdateSQL(final String sql, final Object[] values) {
		getHibernateTemplate().bulkUpdate(sql, values);
	}

	@Override
	public void batchUpdateSQL(final String sql,final Object[][] values) {
		
		getHibernateTemplate().execute(new HibernateCallback() {

			@Override
			public Boolean doInHibernate(Session session)
					throws HibernateException {
				session.doWork(new Work() {
					@Override
					public void execute(Connection connection) throws SQLException {
						PreparedStatement pstmt = connection.prepareStatement(sql);// 预编译
						for (Object[] row : values) {
							for (int i = 0; i < row.length; i++) {
								pstmt.setObject(i + 1, row[i]);
							}
							pstmt.addBatch();
						}
						pstmt.executeBatch();// 将参数加入到批处理
					}
				});
				
				return true;
			}
		});
	}
	
	
	
	/**
	 * CommonDAO 内部方法,Query
	 * @param hql hql
	 * @param cacheable cacheable
	 * @param cacheRegion cacheRegion
	 * @param values values
	 * @return List 对象
	 */
	private List createQuery(String hql, boolean cacheable,String cacheRegion, Object...values){
		if(cacheable){
			getHibernateTemplate().setCacheQueries(true);
			if(cacheRegion!=null&&(!cacheRegion.equals(""))){
				getHibernateTemplate().setQueryCacheRegion(cacheRegion);
			}
		}
		
		List list=new ArrayList();
		if(values!=null){
			list = super.getHibernateTemplate().find(hql,values);
		}else{
			list = super.getHibernateTemplate().find(hql);
		}
		getHibernateTemplate().setCacheQueries(false);// 用完后立即关闭,防止其他查询被缓存
		return list;
	}
	
	
	@Override
	public void delete(Class clazz, Serializable id) {
		getHibernateTemplate().delete(getHibernateTemplate().get(clazz, id));
	}

	@Override
	public void delete(Object o) {
		getHibernateTemplate().delete(o);
	}

	@Override
	public Integer deleteByValues(Class cls, String fieldName,
			String[] values) {
	
	
		    	
		    StringBuilder ins=new StringBuilder();
		    ins.append("'");
		    for (String v : values) {
		    	ins.append(v).append("','");
			}

			String hql = "delete from " + cls.getSimpleName() + " where "
					+ fieldName + " in(" + ins.substring(0, ins.length()-2) + ")";
	
		return getHibernateTemplate().bulkUpdate(hql);
	}

	@Override
	public void deleteCascadeByValues(Class cls, String fieldName, String[] values) {
	    StringBuilder ins=new StringBuilder();
	    ins.append("'");
	    for (String v : values) {
	    	ins.append(v).append("','");
		}
		String hql = "from " + cls.getSimpleName() + " where "
				+ fieldName + " in(" + ins.substring(0, ins.length()-2) + ")";
		
		List list=getHibernateTemplate().find(hql);
		
		for (Object o : list) {
			getHibernateTemplate().delete(o);
		}
	}
	
	@Override
	public void evict(Class cls) {
		HibernateSessionFactory.getSessionFactory().getCache().evict(cls);
	}

	@Override
	public void evict(Class cls, Serializable id) {
		HibernateSessionFactory.getSessionFactory().getCache().evict(cls, id);
	}

	@Override
	public void evictAll() {
		HibernateSessionFactory.getSessionFactory().getCache().evictAll();
	}
	
	@Override
	public void evictCollectionRegion(String collectionRegion) {
		HibernateSessionFactory.getSessionFactory().getCache()
				.evictCollectionRegion(collectionRegion);
	}

	@Override
	public void evictCollectionRegion(String collectionRegion, Serializable id) {
		HibernateSessionFactory.getSessionFactory().getCache()
				.evictCollection(collectionRegion, id);

	}

	@Override
	public void evictQueries() {
		if (null != DEFAULT_QUERY_CACHE_REGION
				|| (!"".equals(DEFAULT_QUERY_CACHE_REGION))) {
			HibernateSessionFactory.getSessionFactory().getCache()
			.evictQueryRegion(DEFAULT_QUERY_CACHE_REGION);
		} else {
			HibernateSessionFactory.getSessionFactory().getCache()
					.evictQueryRegions();
		}
	}



	@Override
	public void evictQueries(String queryCacheRegion) {
		HibernateSessionFactory.getSessionFactory().getCache().evictQueryRegion( queryCacheRegion );
	}
	@Override
	public  T find(Class clazz, Serializable id) {
			return (T) getHibernateTemplate().get(clazz, id);
	}
	@Override
	public List find(String hql,EasyCriteria easyCriteria){
		if(easyCriteria!=null){
			return find(hql+" "+easyCriteria.getCondition(), easyCriteria.getValues().toArray());
		}else{
			return find(hql);
		}
		
	}

	@Override
	public List find(String hql, Object... values) {
		return createQuery(hql, false, null, values);
		
	}
	@Override
	public List findAll(Class cls) {
		    String queryString = "from " + cls.getName();
		    return createQuery(queryString, false, null);
	}

	@Override
	public List findByCache(String hql, EasyCriteria easyCriteria){
		
		if(easyCriteria!=null){
			return findByCache(hql+" "+easyCriteria.getCondition(), easyCriteria.getValues().toArray());
		}else{
			return findByCache(hql);
		}
		
	
	
	}
	@Override
	public List findByCache(String hql, Object... values) {
		    return createQuery(hql, true, null, values);
	}

	@Override
	public List findByCache(String hql, String queryCacheRegion, EasyCriteria easyCriteria){
		
		if(easyCriteria!=null){
			return findByCache(hql+" "+easyCriteria.getCondition(), queryCacheRegion, easyCriteria.getValues().toArray());
		}else{
			return findByCache(hql, queryCacheRegion);
		}
	}
	@Override
	public List findByCache(String hql, String queryCacheRegion, Object... values) {
		    return createQuery(hql, true, queryCacheRegion, values);
	}

	@Override
	public void findByPage(PageBean pageBean) {
		this.findByPage(pageBean,new ArrayList());
	}
	
	@Override
	public void findByPage(PageBean pageBean, EasyCriteria easyCriteria) {
		if(easyCriteria!=null){
			pageBean.setCondition(easyCriteria.getCondition());
			this.findByPage(pageBean,easyCriteria.getValues());
		}else{
			this.findByPage(pageBean);
		}
	}

	@Override
	public void findByPage(final PageBean pageBean,final List values) {
		final String hql = pageBean.getQuery() != null ? pageBean.getQuery()
				: pageBean.getAutoQuery();
		
		getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public List doInHibernate(Session session) throws HibernateException {
				
				Query query=session.createQuery(hql);
				if(values!=null&&values.size()>0){
					for (int i = 0; i < values.size(); i++) {
						query.setParameter(i, values.get(i));
					}
				}
			    query.setFirstResult(pageBean.getRowStart());
				query.setMaxResults(pageBean.getRowsPerPage());
					
				pageBean.setData(query.getResultList());
				
				String queryString = "";
				int end = hql.length();
				if (hql.indexOf("order by") != -1) {
					end = hql.indexOf("order by");
				}
				if (hql.toUpperCase().indexOf("SELECT") != -1) {
					int i = hql.toUpperCase()
							.indexOf("FROM");
					queryString = "select count(1) " + hql.substring(i, end);
				} else {
					queryString = "select count(1) " + hql.substring(0, end);
				}
					
					// 去掉ORDER BY 的部分
					int j = queryString.toUpperCase().lastIndexOf("ORDER");
					if (j != -1) {
						queryString = queryString.substring(0, j);
					}
					Query cquery=session.createQuery(queryString);
					if(values!=null&&values.size()>0){
						for (int i = 0; i < values.size(); i++) {
							cquery.setParameter(i, values.get(i));
						}
					}
					
					int maxRow = (Integer.valueOf(cquery.getSingleResult().toString())).intValue();
					pageBean.setRowsCount(maxRow);
				return null;
			}
		});
		
	
		
		
	}

	@Override
	public List findByProperty(Class cls, String propertyName, Object value) {
			String queryString = "from " + cls.getName()
					+ " model where model." + propertyName + "= ?";
			return find(queryString, value);
	}
	
	
	@Override
	public List findByPropertyIgnoreCase(Class cls, String propertyName,
			String value) {
			String queryString = "from " + cls.getName()
					+ " model where lower(model." + propertyName + ")= ?";
			return find(queryString, value.toLowerCase());
	}
	
	@Override
	public List findBySQL(String sql, Class resultClass, EasyCriteria easyCriteria) {
		if(easyCriteria!=null){
			return findBySQL(sql+" "+easyCriteria.getCondition(), resultClass, easyCriteria.getValues().toArray());
		}else{
			return findBySQL(sql, resultClass);
		}
	}
	@Override
	public List findBySQL(final String sql, final Class resultClass, final Object... values) {
		return getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public List doInHibernate(Session session)
					throws HibernateException {
				NativeQuery query= session.createNativeQuery(sql,resultClass);
				
				if(values!=null & values.length>0){
					for (int i = 0; i < values.length; i++) {
						query.setParameter(i, values[i]);
					}
				}
				return query.getResultList();
			}
		});
		
	}
	
	@Override
	public List findBySQL(String sql, EasyCriteria easyCriteria) {
		if(easyCriteria!=null){
			return findBySQL(sql+" "+easyCriteria.getCondition(), easyCriteria.getValues().toArray());
		}else{
			return findBySQL(sql);
		}
	}

	@Override
	public List findBySQL(final String sql, final Object... values) {
		return getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public List doInHibernate(Session session)
					throws HibernateException {
				NativeQuery query= session.createNativeQuery(sql);
				
				if(values!=null & values.length>0){
					for (int i = 0; i < values.length; i++) {
						query.setParameter(i, values[i]);
					}
				}
				return query.getResultList();
			}
		});
	}
	@Override
	public int findCount(String hql,EasyCriteria easyCriteria) {
		if(easyCriteria!=null){
			return findCount(hql+" "+easyCriteria.getCondition(), easyCriteria.getValues().toArray());
		}else{
			return findCount(hql);
		}
	}
	

	@Override
	public int findCount(final String hql, final Object... values) {
		return Integer.valueOf(getHibernateTemplate().find(hql, values).get(0).toString());
	}

	@Override
	public List findMapResultBySQL(String sql,EasyCriteria easyCriteria){
		if(easyCriteria!=null){
			return findMapResultBySQL(sql+" "+easyCriteria.getCondition(), easyCriteria.getValues().toArray());
		}else{
			return findMapResultBySQL(sql);
		}
	}

	@Override
	public List findMapResultBySQL(final String sql, final Object... values){
		
		return getHibernateTemplate().execute(new HibernateCallback() {
			@SuppressWarnings("deprecation")
			@Override
			public List doInHibernate(Session session)
					throws HibernateException {
				NativeQuery query= session.createNativeQuery(sql);
				if(values!=null & values.length>0){
					for (int i = 0; i < values.length; i++) {
						query.setParameter(i, values[i]);
					}
				}
				query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
				return query.getResultList();
			}
		});
	}

	@Override
	public int findMaxPage(String hql, int rowsPerPage, EasyCriteria easyCriteria) {
		return (this.findCount(hql, easyCriteria) - 1) / rowsPerPage + 1;
	}

	
	@Override
	public int findMaxPage(String hql, int rowsPerPage, Object... values) {
		return (this.findCount(hql, values) - 1) / rowsPerPage + 1;
	}


	@Override
	public List findNamedQuery(String name, Object... values) {
		return getHibernateTemplate().findByNamedQuery(name, values);
	}

	@Override
	public List findNamedQueryByCache(String name, String queryCacheRegion, Object... values) {
		getHibernateTemplate().setCacheQueries(true);
		if(queryCacheRegion!=null&&(!queryCacheRegion.equals(""))){
			getHibernateTemplate().setQueryCacheRegion(queryCacheRegion);
		}
		List list=getHibernateTemplate().findByNamedQuery(name, values);
		getHibernateTemplate().setCacheQueries(false);
		return list;
	}

	@Override
	public List findTop( String hql, int topCount,  EasyCriteria easyCriteria){
		
		if(easyCriteria!=null){
			return findTop(hql+" "+easyCriteria.getCondition(), topCount, easyCriteria.getValues().toArray());
		}else{
			return findTop(hql, topCount);
			
		}
	}

	@Override
	public List findTop(final String hql,  final int topCount, final Object... values) {
		return getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public List doInHibernate(Session session) throws HibernateException {
					Query q=session.createQuery(hql);
				    q.setFirstResult(0);
					q.setMaxResults(topCount);
					if (values != null && values.length > 0) {
						for (int i = 0; i < values.length; i++) {
							q.setParameter(i, values[i]);
						}
					}
				return q.getResultList();
			}
		});
	}
	@Override
	public  T findVal(String hql,  EasyCriteria easyCriteria) {
		List list = this.find(hql, easyCriteria);
		return (T) (list.size() > 0 ? list.get(0) : null);
	}

	@Override
	public  T findVal(String hql, Object... values) {
		List list = this.find(hql, values);
		return (T) (list.size() > 0 ? list.get(0) : null);
	}

	@Override
	public Session getCurrentSession() {
		return HibernateSessionFactory.getSession();
	}

	@Override
	public void initialize(Object proxy) {
		if (!Hibernate.isInitialized(proxy)) {
			Hibernate.initialize(proxy);
		}
	}

	@Override
	public void initializeDeep(Collection collection) {

		if (collection == null) {
			return;
		}

		for (Object obj : collection) {
			Method[] methods = obj.getClass().getMethods();
			if (methods != null) {
				for (int j = 0; j < methods.length; j++) {
					String getName = methods[j].getName();
					if (getName.length() > 3 && getName.startsWith("get")) {
						String getFix = getName.substring(3, getName.length());
						for (int k = 0; k < methods.length; k++) {
							String setName = methods[k].getName();
							if (setName.length() > 3
									&& setName.startsWith("set")) {
								String setFix = setName.substring(3,
										setName.length());
								if (getFix.equals(setFix)) {
									try {
										Object o = methods[j].invoke(obj,
												new Object[0]);
										if (o != null) {
											Hibernate.initialize(o);
											methods[k].invoke(obj, o);
										}

									} catch (IllegalArgumentException e) {
										e.printStackTrace();
									} catch (IllegalAccessException e) {
										e.printStackTrace();
									} catch (InvocationTargetException e) {
										e.printStackTrace();
									}
								}
							}
						}
					}

				}
			}

		}
	}
	@Override
	public void merge(Object o) {
		getHibernateTemplate().update(o);
	}

	@Override
	public void persist(Object o) {
		getHibernateTemplate().save(o);
	}


	@Override
	public void updateByHql(String hql, Object... values) {
		getHibernateTemplate().bulkUpdate(hql, values);
	}

	@Override
	public void updateBySQL(final String sql, final Object... values) {
		
		getHibernateTemplate().execute(new HibernateCallback() {

			@Override
			public Boolean doInHibernate(Session session) throws HibernateException {

				NativeQuery query=session.createNativeQuery(sql);
				
				if(values!=null&&values.length>0){
					for (int i = 0; i < values.length; i++) {
						query.setParameter(i, values[i]);
					}
				}
				query.executeUpdate();
				
				return true;
			}
		});
		
	}

	

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy