Newer
Older
alarm / src / com / casic / core / hibernate / HibernateGenericDao.java
zhout on 2 Mar 2022 6 KB first commit
 package com.casic.core.hibernate;

 import org.apache.commons.beanutils.PropertyUtils;
 import org.hibernate.Criteria;
 import org.hibernate.Query;
 import org.hibernate.SessionFactory;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.Order;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 import org.springframework.util.ReflectionUtils;
 import org.springframework.util.StringUtils;

 import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Map;
 
 public class HibernateGenericDao extends HibernateBasicDao
 {
   public HibernateGenericDao()
   {
   }
 
   public HibernateGenericDao(SessionFactory sessionFactory)
   {
     super(sessionFactory);
   }
 
   public Query createQuery(String hql, Object[] values)
   {
     Assert.hasText(hql, "hql cannot be null");
 
     Query query = getSession().createQuery(hql);
 
     for (int i = 0; i < values.length; i++) {
       query.setParameter(i, values[i]);
     }
 
     return query;
   }
 
   public Query createQuery(String hql, Map<String, Object> map)
   {
     Assert.hasText(hql, "hql cannot be null");
 
     Query query = getSession().createQuery(hql);
 
     if (map != null) {
       query.setProperties(map);
     }
 
     return query;
   }
 
   public Criteria createCriteria(Class entityClass, Criterion[] criterions)
   {
     Criteria criteria = getSession().createCriteria(entityClass);
 
     for (Criterion c : criterions) {
       criteria.add(c);
     }
 
     return criteria;
   }
 
   public <T> Criteria createCriteria(Class<T> entityClass, String orderBy, boolean isAsc, Criterion[] criterions)
   {
     if (StringUtils.hasText(orderBy)) {
       Criteria criteria = createCriteria(entityClass, criterions);
 
       if (isAsc)
         criteria.addOrder(Order.asc(orderBy));
       else {
         criteria.addOrder(Order.desc(orderBy));
       }
 
       return criteria;
     }
     return createCriteria(entityClass, criterions);
   }
 
   @Transactional(readOnly=true)
   public <T> List<T> find(Class<T> entityClass, Criterion[] criterions)
   {
     return createCriteria(entityClass, criterions).list();
   }
 
   @Transactional(readOnly=true)
   public <T> T findUnique(Class<T> entityClass, Criterion[] criterions)
   {
     return (T) createCriteria(entityClass, criterions).uniqueResult();
   }
 
   @Transactional(readOnly=true)
   public List find(String hql, Object[] values)
   {
     return createQuery(hql, values).list();
   }
 
   @Transactional(readOnly=true)
   public List find(String hql, Map<String, Object> map)
   {
	   List list = null;
	   try {
		    list = createQuery(hql, map).list();
	   } catch (Exception e) {
		   e.printStackTrace();
	   }
       return list;
   }
 
   @Transactional(readOnly=true)
   public <T> T findUnique(String hql, Object[] values)
   {
     return (T) createQuery(hql, values).setMaxResults(1).uniqueResult();
   }
 
   @Transactional(readOnly=true)
   public <T> T findUnique(String hql, Map<String, Object> map)
   {
     return (T) createQuery(hql, map).setMaxResults(1).uniqueResult();
   }
 
   @Transactional(readOnly=true)
   public <T> List<T> findBy(Class<T> entityClass, String name, Object value)
   {
     Assert.hasText(name, "property name cannot be null");
 
     return createCriteria(entityClass, new Criterion[] { Restrictions.eq(name, value) }).list();
   }
 
   @Transactional(readOnly=true)
   public <T> List<T> findByLike(Class<T> entityClass, String name, Object value)
   {
     Assert.hasText(name, "property name cannot be null");
 
     return createCriteria(entityClass, new Criterion[] { Restrictions.like(name, value) }).list();
   }
 
   @Transactional(readOnly=true)
   public <T> List<T> findByIds(Class<T> entityClass, List ids)
   {
     Assert.notEmpty(ids);
 
     String idName = getIdName(entityClass);
     Criterion criterion = Restrictions.in(idName, ids);
 
     return find(entityClass, new Criterion[] { criterion });
   }
 
   @Transactional(readOnly=true)
   public <T> T findUniqueBy(Class<T> entityClass, String name, Object value)
   {
     return (T) createCriteria(entityClass, new Criterion[] { Restrictions.eq(name, value) }).setMaxResults(1).uniqueResult();
   }
 
   @Transactional(readOnly=true)
   public <T> boolean isUnique(Class<T> entityClass, T entity, String uniquePropertyNames)
   {
     Assert.hasText(uniquePropertyNames);
 
     Criteria criteria = createCriteria(entityClass, new Criterion[0]).setProjection(Projections.rowCount());
 
     String[] nameList = uniquePropertyNames.split(",");
     try
     {
       for (String name : nameList) {
         criteria.add(Restrictions.eq(name, PropertyUtils.getProperty(entity, name)));
       }
 
       String idName = getIdName(entityClass);
 
       Serializable id = getId(entityClass, entity);
 
       if (id != null)
         criteria.add(Restrictions.not(Restrictions.eq(idName, id)));
     }
     catch (IllegalAccessException e) {
       ReflectionUtils.handleReflectionException(e);
     } catch (NoSuchMethodException e) {
       ReflectionUtils.handleReflectionException(e);
     } catch (InvocationTargetException e) {
       ReflectionUtils.handleReflectionException(e);
     }
 
     Object result = criteria.uniqueResult();
 
     return HibernateUtils.getNumber(result).intValue() == 0;
   }
 
   @Transactional(readOnly=true)
   public <T> Integer getCount(Class<T> entityClass)
   {
     return getCount(createCriteria(entityClass, new Criterion[0]));
   }
 
   @Transactional(readOnly=true)
   public Integer getCount(Criteria criteria)
   {
     Object result = criteria.setProjection(Projections.rowCount()).uniqueResult();
 
     return HibernateUtils.getNumber(result);
   }
 
   @Transactional(readOnly=true)
   public Integer getCount(String hql, Object[] values)
   {
     Object result = createQuery(hql, values).uniqueResult();
 
     return HibernateUtils.getNumber(result);
   }
 
   @Transactional(readOnly=true)
   public Integer getCount(String hql, Map<String, Object> map)
   {
     Object result = createQuery(hql, map).uniqueResult();
 
     return HibernateUtils.getNumber(result);
   }
 
   @Transactional
   public int batchUpdate(String hql, Object[] values)
   {
     return createQuery(hql, values).executeUpdate();
   }
 
   @Transactional
   public int batchUpdate(String hql, Map<String, Object> map)
   {
     return createQuery(hql, map).executeUpdate();
   }
 }