公共Dao DaoImpl

  1. package com.iteye.tianshi.core.web.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Collection;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.hibernate.LockMode;  
  9. import org.springframework.dao.DataAccessException;  
  10. import org.springframework.jdbc.core.JdbcTemplate;  
  11. import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;  
  12. import org.springframework.orm.hibernate3.HibernateTemplate;  
  13.   
  14. import com.iteye.tianshi.core.page.Page;  
  15. import com.iteye.tianshi.core.page.PageRequest;  
  16. import com.iteye.tianshi.core.util.SQLOrderMode;  
  17.   
  18. /** 
  19.  * 提供了常用增删改查(CRUD)功能的DAO基础接口。<BR> 
  20.  * 实体状态说明: 
  21.  * 
  22.  * <pre> 
  23.  *     持久化状态:已经被持久化了且与当前Session关联的实体状态。 
  24.  *     临时状态:没有被持久化过的实体状态。 
  25.  *     游离状态:已经被持久化,但是没有与当前Session关联的实体对象,且有相同标识的对象与当前Session关联。 
  26.  * </pre> 
  27.  * 
  28.  * @datetime 2010-7-6 下午08:19:49 
  29.  * @author jiangzx@yahoo.com 
  30.  */  
  31. public interface GenericDao<E, PK extends Serializable> {  
  32.         /** 
  33.          * 按照实体类型和实体唯一标识查询实体。 
  34.          * @param id 
  35.          * @return 
  36.          */  
  37.         public E find(PK id);  
  38.   
  39.         /** 
  40.          * 按照实体类型和实体唯一标识查询实体,并锁定该实体对象,直到事务结束。 
  41.          * @param id 
  42.          * @param lockMode 
  43.          * @return 
  44.          */  
  45.         public E findAndLock(PK id, LockMode lockMode);  
  46.   
  47.         /** 
  48.          * 删除实体主键id标识的实体。 
  49.          * 
  50.          * @param id 
  51.          */  
  52.         public void delete(PK id);  
  53.   
  54.         /** 
  55.          * 持久化一个实体。 
  56.          * 
  57.          * @param entity 处于临时状态的实体。 
  58.          */  
  59.         public void create(E entity);  
  60.   
  61.         /** 
  62.          * 持久化多个实体。 
  63.          * 
  64.          * @param entities 处于临时状态的实体的集合。 
  65.          */  
  66.         public void create(Collection<E> entities);  
  67.   
  68.         /** 
  69.          * 更新实体。 
  70.          * 
  71.          * @param entity 处于持久化状态的实体。 
  72.          */  
  73.         public void update(E entity);  
  74.   
  75.         /** 
  76.          * 更新多个实体。 
  77.          * 
  78.          * @param entities 处于持久化状态的实体的集合。 
  79.          */  
  80.         public void update(Collection<E> entities);  
  81.   
  82.         /** 
  83.          * 持久化或者更新实体。 
  84.          * 
  85.          * @param entity 处于临时或者持久化状态的实体。 
  86.          */  
  87.         public void createOrUpdate(E entity);  
  88.   
  89.         /** 
  90.          * 持久化或者更新多个实体。 
  91.          * 
  92.          * @param entities 处于临时或者持久化状态的实体的集合。 
  93.          */  
  94.         public void createOrUpdate(Collection<E> entities);  
  95.   
  96.         /** 
  97.          * 更新处于游离状态的实体,更新后实体对象仍然处于游离状态。 
  98.          * 
  99.          * @param entity 处于游离状态的实体。 
  100.          */  
  101.         public void merge(E entity);  
  102.   
  103.         /** 
  104.          * 保存处于游离状态的多个实体,更新后实体对象仍然处于游离状态。 
  105.          * 
  106.          * @param entities 处于游离状态的实体的集合。 
  107.          */  
  108.         public void merge(Collection<E> entities);  
  109.   
  110.         /** 
  111.          * 删除一个持久化的实体。 
  112.          * 
  113.          * @param entity 处于持久化状态的实体。 
  114.          */  
  115.         public void delete(E entity);  
  116.   
  117.         /** 
  118.          * 删除多个持久化的实体。 
  119.          * 
  120.          * @param entities 处于持久化状态的实体的集合。 
  121.          */  
  122.         public void delete(Collection<E> entities);  
  123.          
  124.         /** 
  125.          * 批量删除 
  126.          * 
  127.          * @param entity 
  128.          * @param propertyNames 
  129.          * @param values 
  130.          */  
  131.         public void bulkDelete(Class<E> clazz, String[] propertyNames, Object[] values);  
  132.   
  133.         /** 
  134.          * 刷新持久化实体到数据库 
  135.          * 
  136.          * @param entity 处于持久化状态的实体。 
  137.          */  
  138.         public void refresh(Object entity);  
  139.   
  140.         /** 
  141.          * 按照泛型的实体类型查询得到所有持久化实体。 
  142.          * 
  143.          * @return 所有持久化实体的集合 
  144.          */  
  145.         public List<E> findAll();  
  146.          
  147.         /** 
  148.          * 查询出所有的持久化实体,并排序 
  149.          * 
  150.          * @param orderCol 排序字段 
  151.          * @param orderMode 排序模式(降序或升序) 
  152.          * @return 所有持久化实体的集合 
  153.          */  
  154.         public List<E> findByOrder(String orderCol, SQLOrderMode orderMode);  
  155.          
  156.         /** 
  157.          * 根据属性名称与值,查询出所有满足条件的持久化实体,并排序 
  158.          * 
  159.          * @param propertyName 属性名称 
  160.          * @param value 属性值 
  161.          * @param orderCol 排序字段 
  162.          * @param orderMode 排序模式(降序或升序) 
  163.          * @return 所有持久化实体的集合 
  164.          */  
  165.         public List<E> findByPropertyAndOrder(String propertyName, Object value, String orderCol, SQLOrderMode orderMode);  
  166.          
  167.         /** 
  168.          * 根据属性名称与值,查询出所有满足条件的持久化实体,并排序 
  169.          * 
  170.          * @param propertyName 属性名称 
  171.          * @param value 属性值 
  172.          * @param orderCol 排序字段 
  173.          * @param orderMode 排序模式(降序或升序) 
  174.          * @return 所有持久化实体的集合 
  175.          */  
  176.         public List<E> findByPropertysAndOrders(String[] joinEntitys,String[] propertyNames, Object[] values, String[] orderCol, SQLOrderMode orderMode);  
  177.          
  178.         /** 
  179.          * 根据多对属性名称与值,查询出所有满足条件的持久化实体,并排序 
  180.          * 
  181.          * @param propertyNames 属性名称 
  182.          * @param values 属性值 
  183.          * @param orderCol 排序字段 
  184.          * @param orderMode 排序模式(降序或升序) 
  185.          * @return 所有持久化实体的集合 
  186.          */  
  187.         public List<E> findByPropertysAndOrder(String[] propertyNames, Object[] values, String orderCol, SQLOrderMode orderMode);  
  188.          
  189.         /** 
  190.          * 根据多对属性名称与值,查询出所有满足条件的持久化实体,并排序 
  191.          * 
  192.          * @param joinEntitys 连接查询的实体名称 
  193.          * @param propertyNames 属性名称 
  194.          * @param values 属性值 
  195.          * @param orderCol 排序字段 
  196.          * @param orderMode 排序模式(降序或升序) 
  197.          * @return 所有持久化实体的集合 
  198.          */  
  199.         public List<E> findByPropertysAndOrder(String[] joinEntitys, String[] propertyNames, Object[] values, String orderCol, SQLOrderMode orderMode);  
  200.   
  201.         /** 
  202.          * 根据属性名称与值,查询出所有满足条件的持久化实体 
  203.          * 
  204.          * @param propertyName 属性名称 
  205.          * @param value 属性值 
  206.          * @return 所有持久化实体的集合 
  207.          */  
  208.         public List<E> findByProperty(String propertyName, Object value);  
  209.   
  210.         /** 
  211.          * 根据多对属性名称与值,查询出所有满足条件的持久化实体 
  212.          * 
  213.          * @param propertyNames 属性名称 
  214.          * @param values 属性值 
  215.          * @return 所有持久化实体的集合 
  216.          * @throws DataAccessException 
  217.          */  
  218.         public List<E> findByPropertys(String[] propertyNames, Object[] values);  
  219.   
  220.         /** 
  221.          * 按照泛型的实体类型,分页查询得到所有持久化实体。 
  222.          * @return 所有持久化实体的集合 
  223.          */  
  224.         Page<E> findAllForPage(PageRequest<E> pageRequest);  
  225.   
  226.         /** 
  227.          * 查询结果返回为长整形 
  228.          * 
  229.          * @param queryString HQL语句 
  230.          * @return 
  231.          */  
  232.         public Long queryForLong(final String queryString);  
  233.   
  234.         /** 
  235.          * 查询结果返回为长整形 
  236.          * 
  237.          * @param queryString HQL语句 
  238.          * @param values HQL语句参数 
  239.          * @return 
  240.          */  
  241.         public Long queryForLong(final String queryString, Object... values);  
  242.   
  243.         /** 
  244.          * 查询结果返回为类型T 
  245.          * 
  246.          * @param requiredType 返回数据类型 
  247.          * @param queryString HQL语句 
  248.          * @return 
  249.          */  
  250.         public <T> T queryForObject(Class<T> requiredType, final String queryString);  
  251.   
  252.         /** 
  253.          * 查询结果返回为类型T 
  254.          * 
  255.          * @param requiredType 返回数据类型 
  256.          * @param queryString HQL语句 
  257.          * @param values HQL语句参数 
  258.          * @return 
  259.          */  
  260.         public <T> T queryForObject(Class<T> requiredType, final String queryString, Object... values);  
  261.   
  262.         /** 
  263.          * 使用HSQL语句直接增加、更新、删除实体 
  264.          * 
  265.          * @param queryString HQL语句 
  266.          * @return 
  267.          */  
  268.         public int bulkUpdate(String queryString);  
  269.   
  270.         /** 
  271.          * 使用带参数HSQL语句直接增加、更新、删除实体 
  272.          * 
  273.          * @param queryString HQL语句 
  274.          * @param values HQL语句参数 
  275.          * @return 
  276.          */  
  277.     public int bulkUpdate(String queryString, Object... values);  
  278.   
  279.     /** 
  280.      * 使用HSQL语句检索数据 
  281.      * 
  282.      * @param queryString HQL语句 
  283.      * @return 
  284.      */  
  285.     public List<?> find(String queryString);  
  286.   
  287.     /** 
  288.      * 使用带参数的HSQL语句检索数据 
  289.      * 
  290.      * @param queryString HQL语句 
  291.      * @param values HQL语句参数 
  292.      * @return 
  293.      */  
  294.     public List<?> find(String queryString, Object... values);  
  295.   
  296.     /** 
  297.      * 使用带命名的参数的HSQL语句检索数据 
  298.      * 
  299.      * @param queryString 
  300.      * @param paramNames 
  301.      * @param values 
  302.      * @return 
  303.      */  
  304.     public List<?> findByNamedParam(String queryString, String[] paramNames,  
  305.             Object[] values);  
  306.   
  307.     /** 
  308.      * 使用命名的HSQL语句检索数据 
  309.      * 
  310.      * @param queryName 
  311.      * @return 
  312.      */  
  313.     public List<?> findByNamedQuery(String queryName);  
  314.   
  315.     /** 
  316.      * 使用带参数的命名HSQL语句检索数据 
  317.      * 
  318.      * @param queryName 
  319.      * @param values 
  320.      * @return 
  321.      */  
  322.     public List<?> findByNamedQuery(String queryName, Object[] values);  
  323.   
  324.     /** 
  325.      * 使用带命名参数的命名HSQL语句检索数据 
  326.      * 
  327.      * @param queryName 
  328.      * @param paramNames 
  329.      * @param values 
  330.      * @return 
  331.      */  
  332.     public List<?> findByNamedQueryAndNamedParam(String queryName,  
  333.             String[] paramNames, Object[] values);  
  334.   
  335.     /** 
  336.          * 判断对象某些属性的值在数据库中是否唯一. 
  337.          * 
  338.          * @param uniquePropertyNames 
  339.          *            在POJO里不能重复的属性列表,以逗号分割 如"name,loginid,password" 
  340.          */  
  341.         public boolean isUnique(E entity, String uniquePropertyNames);  
  342.   
  343.         /** 
  344.          * 执行存储过程 
  345.          * 使用Spring JDBC 来调用存储过程 
  346.          * 
  347.          * @param spName 存储过程名称 
  348.          * @param parameters 存储过程参数 
  349.          */  
  350.         public void execute(String spName, Map<String, Object> parameters);  
  351.   
  352.         /** 
  353.          * 执行存储过程 
  354.          * 使用Spring JDBC 来调用存储过程 
  355.          * 
  356.          * @param spName 存储过程名称 
  357.          * @throws DataAccessException 
  358.          */  
  359.         public void execute(String spName);  
  360.          
  361.         /** 
  362.          * 
  363.          * @return NamedParameterJdbcTemplate 
  364.          */  
  365.         public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate();  
  366.          
  367.         /** 
  368.          * 
  369.          * @return JdbcTemplate 
  370.          */  
  371.         public JdbcTemplate getJdbcTemplate();  
  372.          
  373.         /** 
  374.          * return HiberTemplate 
  375.          */  
  376.         public HibernateTemplate getHiberTemplate();  
  377. }  



---------------------------------------------------------------------------------------GenericDaoImpl------------------------------------------------------------------------


  1. package com.iteye.tianshi.core.web.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.lang.reflect.ParameterizedType;  
  5. import java.lang.reflect.Type;  
  6. import java.util.ArrayList;  
  7. import java.util.Collection;  
  8. import java.util.Iterator;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11.   
  12. import org.apache.commons.beanutils.PropertyUtils;  
  13. import org.apache.commons.lang.text.StrBuilder;  
  14. import org.hibernate.Criteria;  
  15. import org.hibernate.LockMode;  
  16. import org.hibernate.Query;  
  17. import org.hibernate.criterion.Projections;  
  18. import org.hibernate.criterion.Restrictions;  
  19. import org.springframework.beans.factory.annotation.Autowired;  
  20. import org.springframework.dao.DataRetrievalFailureException;  
  21. import org.springframework.dao.support.DataAccessUtils;  
  22. import org.springframework.jdbc.core.JdbcTemplate;  
  23. import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;  
  24. import org.springframework.orm.hibernate3.HibernateTemplate;  
  25. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  26. import org.springframework.transaction.annotation.Transactional;  
  27. import org.springframework.util.Assert;  
  28. import org.springframework.util.ReflectionUtils;  
  29. import org.springframework.util.StringUtils;  
  30.   
  31. import com.iteye.tianshi.core.page.Page;  
  32. import com.iteye.tianshi.core.page.PageRequest;  
  33. import com.iteye.tianshi.core.util.BlankMode;  
  34. import com.iteye.tianshi.core.util.LikeMode;  
  35. import com.iteye.tianshi.core.util.SQLOrderMode;  
  36.   
  37. /** 
  38.  * 基于Hibernate的Crud DAO基础实现,所有使用Hibernate并支持Crud操作的DAO都继承该类。<BR> 
  39.  * 可用的异常类如下: 
  40.  * 
  41.  * <pre> 
  42.  * DataAccessException 
  43.  *    CleanupFailureDataAccessException 
  44.  *    ConcurrencyFailureException 
  45.  *         OptimisticLockingFailureException 
  46.  *              ObjectOptimisticLockingFailureException 
  47.  *                   HibernateOptimisticLockingFailureException 
  48.  *         PessimisticLockingFailureException 
  49.  *              CannotAcquireLockException 
  50.  *              CannotSerializeTransactionException 
  51.  *              DeadlockLoserDataAccessException 
  52.  *    DataAccessResourceFailureException 
  53.  *         CannotCreateRecordException 
  54.  *         CannotGetCciConnectionException 
  55.  *         CannotGetJdbcConnectionException 
  56.  *    DataIntegrityViolationException 
  57.  *    DataRetrievalFailureException 
  58.  *         IncorrectResultSetColumnCountException 
  59.  *         IncorrectResultSizeDataAccessException 
  60.  *              EmptyResultDataAccessException 
  61.  *         LobRetrievalFailureException 
  62.  *         ObjectRetrievalFailureException 
  63.  *              HibernateObjectRetrievalFailureException 
  64.  *    DataSourceLookupFailureException 
  65.  *    InvalidDataAccessApiUsageException 
  66.  *    InvalidDataAccessResourceUsageException 
  67.  *         BadSqlGrammarException 
  68.  *         CciOperationNotSupportedException 
  69.  *         HibernateQueryException 
  70.  *         IncorrectUpdateSemanticsDataAccessException 
  71.  *              JdbcUpdateAffectedIncorrectNumberOfRowsException 
  72.  *         InvalidResultSetAccessException 
  73.  *         InvalidResultSetAccessException 
  74.  *         RecordTypeNotSupportedException 
  75.  *         TypeMismatchDataAccessException 
  76.  *    PermissionDeniedDataAccessException 
  77.  *    UncategorizedDataAccessException 
  78.  *         HibernateJdbcException 
  79.  *         HibernateSystemException 
  80.  *         SQLWarningException 
  81.  *         UncategorizedSQLException 
  82.  * </pre> 
  83.  * 
  84.  * @datetime 2010-7-6 下午11:00:00 
  85.  * @author jiangzx@yahoo.com 
  86.  */  
  87. public class GenericDaoImpl<E, PK extends Serializable> extends HibernateDaoSupport implements GenericDao<E, PK> {  
  88.         @Autowired(required=false)  
  89.         protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;  
  90.         @Autowired(required=false)  
  91.         protected JdbcTemplate jdbcTemplate;  
  92.   
  93.         protected Class<E> clazz;  
  94.          
  95.         @SuppressWarnings("unchecked")  
  96.         public GenericDaoImpl() {  
  97.                 Type type = getClass().getGenericSuperclass();  
  98.                 if (type instanceof ParameterizedType) {  
  99.                         clazz = (Class<E>) ((ParameterizedType) type).getActualTypeArguments()[0];  
  100.                 }  
  101.         }  
  102.   
  103.         /** 
  104.          * 获得DAO类对应的实体类型 
  105.          */  
  106.         protected Class<E> getClazz() {  
  107.                 return clazz;  
  108.         }  
  109.   
  110.         public E find(PK id) {  
  111.                 return (E) super.getHibernateTemplate().get(this.getClazz(), id);  
  112.         }  
  113.   
  114.         public void delete(PK id) {  
  115.                 E entity = this.find(id);  
  116.                 if (entity == null) {  
  117.                         throw new DataRetrievalFailureException("No entity found for deletion: " + id);  
  118.                 }  
  119.                 super.getHibernateTemplate().delete(entity);  
  120.         }  
  121.   
  122.         public E findAndLock(PK id, LockMode lockMode) {  
  123.                 E entity = (E) this.getHibernateTemplate().get(this.getClazz(), id, lockMode);  
  124.                 return entity;  
  125.         }  
  126.   
  127.         public void create(E entity) {  
  128.                 super.getHibernateTemplate().save(entity);  
  129.         }  
  130.   
  131.         public void create(Collection<E> entities) {  
  132.                 for(E entity : entities) {  
  133.                         create(entity);  
  134.                 }  
  135.         }  
  136.   
  137.         public void createOrUpdate(E entity) {  
  138.                 super.getHibernateTemplate().saveOrUpdate(entity);  
  139.         }  
  140.   
  141.         public void createOrUpdate(Collection<E> entities) {  
  142.                 for(E entity : entities) {  
  143.                         createOrUpdate(entity);  
  144.                 }  
  145.         }  
  146.         public void delete(E entity) {  
  147.                 super.getHibernateTemplate().delete(entity);  
  148.         }  
  149.   
  150.         @Transactional(readOnly=false)  
  151.         public void delete(Collection<E> entities) {  
  152.                 for(E entity : entities) {  
  153.                         delete(entity);  
  154.                 }  
  155.         }  
  156.          
  157.         public void bulkDelete(Class<E> clazz, String[] propertyNames, Object[] values) {  
  158.                 StrBuilder buf = new StrBuilder();  
  159.                 String entityName = clazz.getSimpleName();  
  160.                 buf.append("delete " + entityName);// 实体名称  
  161.                  
  162.                 int len = propertyNames.length;  
  163.                 for(int i=0; i<len; i++) {  
  164.                         if(i==0)  
  165.                                 buf.append(" WHERE ").append(propertyNames[i]).append(" = :").append(propertyNames[i]);  
  166.                         else  
  167.                                 buf.append(" and ").append(propertyNames[i]).append(" = :").append(propertyNames[i]);  
  168.                 }  
  169.                  
  170.                  Query query = this.getSession().createQuery(buf.toString());  
  171.                  for(int i=0; i<len; i++) {  
  172.                          query.setParameter(propertyNames[i], values[i]);  
  173.                  }  
  174.          query.executeUpdate();  
  175.         }  
  176.   
  177.         public void merge(E entity) {  
  178.                 super.getHibernateTemplate().merge(entity);  
  179.         }  
  180.   
  181.         public void merge(Collection<E> entities) {  
  182.                 for(E entity : entities) {  
  183.                         merge(entity);  
  184.                 }  
  185.         }  
  186.   
  187.         public void update(E entity) {  
  188.                 super.getHibernateTemplate().update(entity);  
  189.         }  
  190.   
  191.         public void update(Collection<E> entities) {  
  192.                 for(E entity : entities) {  
  193.                         update(entity);  
  194.                 }  
  195.         }  
  196.   
  197.         public void refresh(Object entity) {  
  198.                 super.getHibernateTemplate().refresh(entity);  
  199.         }  
  200.   
  201.         public List<E> findAll() {  
  202.                 return this.findByPropertysAndOrder(new String[]{}, new String[]{}, new Object[]{}, null, SQLOrderMode.NOSORT);  
  203.         }  
  204.          
  205.         public List<E> findByOrder(String orderCol, SQLOrderMode orderMode) {  
  206.                 Assert.hasText(orderCol, "orderCol not text");  
  207.                 Assert.notNull(orderMode, "orderMode not null");  
  208.                  
  209.                 return this.findByPropertysAndOrder(new String[]{}, new String[]{}, new Object[]{}, orderCol, orderMode);  
  210.         }  
  211.          
  212.         public List<E> findByPropertyAndOrder(String propertyName, Object value, String orderCol, SQLOrderMode orderMode) {  
  213.                 Assert.hasText(propertyName);  
  214.                 Assert.notNull(value);  
  215.                 Assert.hasText(orderCol, "orderCol not text");  
  216.                 Assert.notNull(orderMode, "orderMode not null");  
  217.   
  218.                 return this.findByPropertysAndOrder(new String[]{}, new String[]{propertyName}, new Object[]{value}, orderCol, orderMode);  
  219.         }  
  220.          
  221.         public List<E> findByPropertysAndOrder(String[] propertyNames, Object[] values, String orderCol, SQLOrderMode orderMode) {  
  222.                 Assert.state(propertyNames.length == values.length);  
  223.                 Assert.hasText(orderCol, "orderCol not text");  
  224.                 Assert.notNull(orderMode, "orderMode not null");  
  225.   
  226.                 return this.findByPropertysAndOrder(new String[]{}, propertyNames, values, orderCol, orderMode);  
  227.         }  
  228.          
  229.         @SuppressWarnings("unchecked")  
  230.         public List<E> findByPropertysAndOrder(String[] joinEntitys, String[] propertyNames, Object[] values, String orderCol, SQLOrderMode orderMode) {  
  231.                 StrBuilder buf = new StrBuilder();  
  232.                  
  233.                 String entityName = this.getClazz().getSimpleName();  
  234.                 String postName = entityName.toLowerCase();  
  235.                 buf.append("FROM " + entityName + " as " + postName + " ");// 实体名称  
  236.   
  237.                 if(joinEntitys != null) {  
  238.                         for(String je : joinEntitys) {  
  239.                                 buf.append(" left outer join fetch " + postName + "." + je + " " + je + " ");  
  240.                         }  
  241.                 }  
  242.                  
  243.                 int len = propertyNames.length;  
  244.                 List<String> propertyNameList = new ArrayList<String>(propertyNames.length);  
  245.                 List<Object> valueList = new ArrayList<Object>(values.length);  
  246.                 if(len>0) {  
  247.                         for(int i=0; i<len; i++) {  
  248.                                 //如果是级联属性标示(例如:entitytype.id"),需要替换.为下划线  
  249.                                 String old = propertyNames[i];  
  250.                                 propertyNames[i] = propertyNames[i].replaceAll("\\.""_");  
  251.                                 if(i==0)  
  252.                                         buf.append(" WHERE ");  
  253.                                 else  
  254.                                         buf.append(" and ");  
  255.                                  
  256.                                 Object value = values[i];  
  257.                                 if(BlankMode.NULL == value)  
  258.                                         buf.append(old).append(" is null ");  
  259.                                 else if(BlankMode.NOTNULL == value)  
  260.                                         buf.append(old).append(" is not null");  
  261.                                 else if(LikeMode.LEFT == value) {  
  262.                                         buf.append(old).append(" like :").append(propertyNames[i]);  
  263.                                         propertyNameList.add(propertyNames[i]);  
  264.                                         valueList.add("%" + values[i]);  
  265.                                 } else if(LikeMode.RIGHT == value) {  
  266.                                         buf.append(old).append(" like :").append(propertyNames[i]);  
  267.                                         propertyNameList.add(propertyNames[i]);  
  268.                                         valueList.add(values[i] + "%");  
  269.                                 } else if(LikeMode.ALL == value) {  
  270.                                         buf.append(old).append(" like :").append(propertyNames[i]);  
  271.                                         propertyNameList.add(propertyNames[i]);  
  272.                                         valueList.add("%" + values[i] + "%");  
  273.                                 } else {  
  274.                                         buf.append(old).append(" = :").append(propertyNames[i]);  
  275.                                         propertyNameList.add(propertyNames[i]);  
  276.                                         valueList.add(values[i]);  
  277.                                 }  
  278.                         }  
  279.                 }  
  280.                  
  281.                 //添加排序字段  
  282.                 if(StringUtils.hasText(orderCol) &&  SQLOrderMode.NOSORT != orderMode)  
  283.                         buf.append(" ORDER BY ").append(orderCol).append(" ").append(orderMode.getMode());  
  284.                  
  285.                 String[] properties = new String[propertyNameList.size()];  
  286.                 for(int i=0, count=propertyNameList.size(); i<count; i++) {  
  287.                         properties[i] = propertyNameList.get(i);  
  288.                 }  
  289.                 return this.getHibernateTemplate().findByNamedParam(buf.toString(), properties, valueList.toArray());  
  290.         }  
  291.   
  292.         public List<E> findByProperty(String propertyName, Object value) {  
  293.                 Assert.hasText(propertyName);  
  294.                 Assert.notNull(value);  
  295.   
  296.                 return this.findByPropertysAndOrder(new String[]{}, new String[]{propertyName}, new Object[]{value}, null, SQLOrderMode.NOSORT);  
  297.         }  
  298.   
  299.         public List<E> findByPropertys(String[] propertyNames, Object[] values) {  
  300.                 Assert.state(propertyNames.length == values.length);  
  301.   
  302.                 return this.findByPropertysAndOrder(new String[]{}, propertyNames, values, null, SQLOrderMode.NOSORT);  
  303.         }  
  304.   
  305.         public Page<E> findAllForPage(final PageRequest<E> pageRequest) {  
  306.                 StringBuilder queryString = new StringBuilder(" FROM ");  
  307.                 StringBuilder countQueryString = new StringBuilder(" FROM ");  
  308.                  
  309.                 String entityName = this.getClazz().getSimpleName();  
  310.                 String postName = entityName.toLowerCase();  
  311.                 queryString.append(entityName + " as " + postName + " ");// 实体名称  
  312.                 countQueryString.append(entityName);// 实体名称  
  313.                 for(String je : pageRequest.getJoinEntitys()) {  
  314.                         queryString.append("left outer join fetch " + postName + "." + je + " " + je + " ");  
  315.                 }  
  316.                  
  317.                 //等于查询条件  
  318.                 Map<String, Object> paramMap = pageRequest.getFilters();  
  319.                 boolean hasWhere = false;  
  320.                 if (paramMap != null && paramMap.size() > 0) {  
  321.                         queryString.append(" WHERE ");  
  322.                         countQueryString.append(" WHERE ");  
  323.                         Iterator<String> keys = paramMap.keySet().iterator();  
  324.                         for (int i = 0; keys.hasNext(); i++) {  
  325.                                 if (hasWhere) {  
  326.                                         queryString.append(" AND ");  
  327.                                         countQueryString.append(" AND ");  
  328.                                 } else  
  329.                                         hasWhere = true;  
  330.                                 String paramName = keys.next();  
  331.                                 queryString.append(paramName).append(" =:").append(paramName);  
  332.                                 countQueryString.append(paramName).append(" =:").append(paramName);  
  333.                         }  
  334.                 }  
  335.                  
  336.                 //Like查询条件  
  337.                 Map<String, String> likeParamMap = pageRequest.getLikeFilters();  
  338.                 if (likeParamMap != null && likeParamMap.size() > 0) {  
  339.                         // 增加查询条件  
  340.                         if(!hasWhere) {  
  341.                                 queryString.append(" WHERE ");  
  342.                                 countQueryString.append(" WHERE ");  
  343.                         }  
  344.                         Iterator<String> keys = likeParamMap.keySet().iterator();  
  345.                         for (int i = 0; keys.hasNext(); i++) {  
  346.                                 if (hasWhere) {  
  347.                                         queryString.append(" AND ");  
  348.                                         countQueryString.append(" AND ");  
  349.                                 } else  
  350.                                         hasWhere = true;  
  351.                                 String paramName = keys.next();  
  352.                                 queryString.append(paramName).append(" like :").append(paramName);  
  353.                                 countQueryString.append(paramName).append(" like :").append(paramName);  
  354.                         }  
  355.                 }  
  356.                  
  357.                 //时间范围条件  
  358.                 String timeField = pageRequest.getTimeField();  
  359.                 if(StringUtils.hasText(timeField)) {  
  360.                         if(pageRequest.getStartTime() != null) {  
  361.                                 if(!hasWhere) {  
  362.                                         queryString.append(" WHERE ");  
  363.                                         countQueryString.append(" WHERE ");  
  364.                                         hasWhere = true;  
  365.                                 } else {  
  366.                                         queryString.append(" AND ");  
  367.                                         countQueryString.append(" AND ");  
  368.                                 }  
  369.                                 queryString.append(timeField).append(" >= :startTime");  
  370.                                 countQueryString.append(timeField).append(" >= :startTime");  
  371.                         }  
  372.                          
  373.                         if(pageRequest.getEndTime() != null) {  
  374.                                 if(!hasWhere) {  
  375.                                         queryString.append(" WHERE ");  
  376.                                         countQueryString.append(" WHERE ");  
  377.                                         hasWhere = true;  
  378.                                 } else {  
  379.                                         queryString.append(" AND ");  
  380.                                         countQueryString.append(" AND ");  
  381.                                 }  
  382.                                 queryString.append(timeField).append(" <= :endTime");  
  383.                                 countQueryString.append(timeField).append(" <= :endTime");  
  384.                         }  
  385.                 }  
  386.                 if(pageRequest.getExtraCondition() != null) {  
  387.                         if(!hasWhere) {  
  388.                                 queryString.append(" WHERE ");  
  389.                                 countQueryString.append(" WHERE ");  
  390.                                 hasWhere = true;  
  391.                         } else {  
  392.                                 queryString.append(" AND ");  
  393.                                 countQueryString.append(" AND ");  
  394.                         }  
  395.                         queryString.append(pageRequest.getExtraCondition());  
  396.                         countQueryString.append(pageRequest.getExtraCondition());  
  397.                 }  
  398.   
  399.                 //排序字段  
  400.                 if (org.springframework.util.StringUtils.hasText(pageRequest.getSortColumns())) {  
  401.                         queryString.append(" ORDER BY " + pageRequest.getSortColumns());  
  402.                 }  
  403.   
  404.                 //创建查询Query  
  405.                 Query query = this.getSession().createQuery(queryString.toString());  
  406.                 Query countQuery = this.getSession().createQuery("SELECT count(*) " + countQueryString.toString());  
  407.                  
  408.                 //设置参数  
  409.                 if (paramMap != null && paramMap.size() > 0) {  
  410.                         Iterator<String> keys = paramMap.keySet().iterator();  
  411.                         for (int i = 0; keys.hasNext(); i++) {  
  412.                                 String key = keys.next();  
  413.                                 query.setParameter(key, paramMap.get(key));  
  414.                                 countQuery.setParameter(key, paramMap.get(key));  
  415.                         }  
  416.                 }  
  417.                  
  418.                 if (likeParamMap != null && likeParamMap.size() > 0) {  
  419.                         Iterator<String> keys = likeParamMap.keySet().iterator();  
  420.                         for (int i = 0; keys.hasNext(); i++) {  
  421.                                 String key = keys.next();  
  422.                                 String value = "%" + likeParamMap.get(key) + "%";  
  423.                                 query.setParameter(key, value);  
  424.                                 countQuery.setParameter(key, value);  
  425.                         }  
  426.                 }  
  427.                  
  428.                 //时间范围条件参数  
  429.                 if(StringUtils.hasText(timeField)) {  
  430.                         if(pageRequest.getStartTime() != null) {  
  431.                                 query.setParameter("startTime", pageRequest.getStartTime());  
  432.                                 countQuery.setParameter("startTime", pageRequest.getStartTime());  
  433.                         }  
  434.                          
  435.                         if(pageRequest.getEndTime() != null) {  
  436.                                 query.setParameter("endTime", pageRequest.getEndTime());  
  437.                                 countQuery.setParameter("endTime", pageRequest.getEndTime());  
  438.                         }  
  439.                 }  
  440.   
  441.                 return executeQueryForPage(pageRequest, query, countQuery);  
  442.         }  
  443.   
  444.         public int bulkUpdate(String queryString, Object... values) {  
  445.                 return super.getHibernateTemplate().bulkUpdate(queryString, values);  
  446.         }  
  447.   
  448.         public int bulkUpdate(String queryString) {  
  449.                 return super.getHibernateTemplate().bulkUpdate(queryString);  
  450.         }  
  451.   
  452.         public List<?> find(String queryString, Object... values) {  
  453.                 return super.getHibernateTemplate().find(queryString, values);  
  454.         }  
  455.   
  456.         public List<?> find(String queryString) {  
  457.                 return super.getHibernateTemplate().find(queryString);  
  458.         }  
  459.   
  460.         public List<?> findByNamedParam(String queryString, String[] paramNames, Object[] values) {  
  461.                 return super.getHibernateTemplate().findByNamedParam(queryString, paramNames, values);  
  462.         }  
  463.   
  464.         public List<?> findByNamedQuery(String queryName, Object[] values) {  
  465.                 return super.getHibernateTemplate().findByNamedQuery(queryName, values);  
  466.         }  
  467.   
  468.         public List<?> findByNamedQuery(String queryName) {  
  469.                 return super.getHibernateTemplate().findByNamedQuery(queryName);  
  470.         }  
  471.   
  472.         public List<?> findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values) {  
  473.                 return super.getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, paramNames, values);  
  474.         }  
  475.   
  476.         public Long queryForLong(String queryString, Object... values) {  
  477.                 return DataAccessUtils.longResult(getHibernateTemplate().find(queryString, values));  
  478.         }  
  479.   
  480.         public Long queryForLong(String queryString) {  
  481.                 return queryForLong(queryString, new Object[] {});  
  482.         }  
  483.   
  484.         public <T> T queryForObject(Class<T> requiredType, String queryString) {  
  485.                 return queryForObject(requiredType, queryString, new Object[] {});  
  486.         }  
  487.   
  488.         public <T> T queryForObject(Class<T> requiredType, String queryString, Object... values) {  
  489.                 return DataAccessUtils.objectResult(getHibernateTemplate().find(queryString, values), requiredType);  
  490.         }  
  491.   
  492.         public boolean isUnique(E entity, String uniquePropertyNames) {  
  493.                 Assert.hasText(uniquePropertyNames);  
  494.                 Criteria criteria = getSession().createCriteria(this.getClazz()).setProjection(Projections.rowCount());  
  495.                 String[] nameList = uniquePropertyNames.split(",");  
  496.                 try {  
  497.                         // 循环加入唯一列  
  498.                         for (int i = 0; i < nameList.length; i++) {  
  499.                                 criteria.add(Restrictions.eq(nameList[i], PropertyUtils.getProperty(entity, nameList[i])));  
  500.                         }  
  501.                 } catch (Exception e) {  
  502.                         ReflectionUtils.handleReflectionException(e);  
  503.                 }  
  504.                 return ((Number) criteria.uniqueResult()).intValue() == 1;  
  505.         }  
  506.   
  507.         public void execute(String spName, Map<String, Object> parameters) {  
  508.   
  509.         }  
  510.   
  511.         public void execute(String spName) {  
  512.   
  513.         }  
  514.   
  515.         //--------------------------------------------private methods--------------------------------------------------  
  516.   
  517.         @SuppressWarnings("unchecked")  
  518.         public <T> Page<T> executeQueryForPage(final PageRequest<T> pageRequest, Query query, Query countQuery) {  
  519.                 Page<T> page = new Page<T>(pageRequest, ((Number) countQuery.uniqueResult()).intValue());  
  520.                 if (page.getTotalCount() <= 0) {  
  521.                         page.setResult(new ArrayList<T>(0));  
  522.                 } else {  
  523.                         page.setResult(query.setFirstResult(page.getFirstResult()).setMaxResults(page.getPageSize()).list());  
  524.                 }  
  525.                 return page;  
  526.         }  
  527.   
  528.         public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {  
  529.                 return namedParameterJdbcTemplate;  
  530.         }  
  531.   
  532.         @Override  
  533.         public JdbcTemplate getJdbcTemplate() {  
  534.                 return jdbcTemplate;  
  535.         }  
  536.   
  537.         @Override  
  538.         public HibernateTemplate getHiberTemplate() {  
  539.                 return this.getHibernateTemplate();  
  540.         }  
  541.          
  542.         /** 
  543.          * 增加多个字段的排序方法 
  544.          */  
  545.         @SuppressWarnings("unchecked")  
  546.         public List<E> findByPropertysAndOrders(String[] joinEntitys, String[] propertyNames, Object[] values, String[] orderCol, SQLOrderMode orderMode) {  
  547.                 StrBuilder buf = new StrBuilder();  
  548.                  
  549.                 String entityName = this.getClazz().getSimpleName();  
  550.                 String postName = entityName.toLowerCase();  
  551.                 buf.append("FROM " + entityName + " as " + postName + " ");// 实体名称  
  552.   
  553.                 if(joinEntitys != null) {  
  554.                         for(String je : joinEntitys) {  
  555.                                 buf.append(" left outer join fetch " + postName + "." + je + " " + je + " ");  
  556.                         }  
  557.                 }  
  558.                  
  559.                 int len = propertyNames.length;  
  560.                 List<String> propertyNameList = new ArrayList<String>(propertyNames.length);  
  561.                 List<Object> valueList = new ArrayList<Object>(values.length);  
  562.                 if(len>0) {  
  563.                         for(int i=0; i<len; i++) {  
  564.                                 //如果是级联属性标示(例如:entitytype.id"),需要替换.为下划线  
  565.                                 String old = propertyNames[i];  
  566.                                 propertyNames[i] = propertyNames[i].replaceAll("\\.""_");  
  567.                                 if(i==0)  
  568.                                         buf.append(" WHERE ");  
  569.                                 else  
  570.                                         buf.append(" and ");  
  571.                                  
  572.                                 Object value = values[i];  
  573.                                 if(BlankMode.NULL == value)  
  574.                                         buf.append(old).append(" is null ");  
  575.                                 else if(BlankMode.NOTNULL == value)  
  576.                                         buf.append(old).append(" is not null");  
  577.                                 else if(LikeMode.LEFT == value) {  
  578.                                         buf.append(old).append(" like :").append(propertyNames[i]);  
  579.                                         propertyNameList.add(propertyNames[i]);  
  580.                                         valueList.add("%" + values[i]);  
  581.                                 } else if(LikeMode.RIGHT == value) {  
  582.                                         buf.append(old).append(" like :").append(propertyNames[i]);  
  583.                                         propertyNameList.add(propertyNames[i]);  
  584.                                         valueList.add(values[i] + "%");  
  585.                                 } else if(LikeMode.ALL == value) {  
  586.                                         buf.append(old).append(" like :").append(propertyNames[i]);  
  587.                                         propertyNameList.add(propertyNames[i]);  
  588.                                         valueList.add("%" + values[i] + "%");  
  589.                                 } else {  
  590.                                         buf.append(old).append(" = :").append(propertyNames[i]);  
  591.                                         propertyNameList.add(propertyNames[i]);  
  592.                                         valueList.add(values[i]);  
  593.                                 }  
  594.                         }  
  595.                 }  
  596.                  
  597.                 //添加排序字段  
  598.                 if (orderCol!=null&&orderCol.length>=0) {  
  599.                         buf.append(" ORDER BY ");  
  600.                         for(int k=0;k<orderCol.length-1;k++){  
  601.                                 buf.append(orderCol[k]).append(" ").append(orderMode.getMode()+",");  
  602.                         }  
  603.                         buf.append(orderCol[orderCol.length-1]).append(" ").append(orderMode.getMode());  
  604.                 }  
  605.                  
  606.                 String[] properties = new String[propertyNameList.size()];  
  607.                 for(int i=0, count=propertyNameList.size(); i<count; i++) {  
  608.                         properties[i] = propertyNameList.get(i);  
  609.                 }  
  610.                 return this.getHibernateTemplate().findByNamedParam(buf.toString(), properties, valueList.toArray());  
  611.         }  
  612.   
  613. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值