泛型的类型获取

               

      T.getClass()或者T.class都是非法的,因为T是泛型变量。由于一个类的类型是什么,是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。获取T应该根据如下方法:

/** *@author zhangwenchao *@version    * 可以在service层直接调用,也可以在DAO层扩展调用 */public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK>{          private Class<T> persistentClass;         /**      * 用于Dao层子类使用的构造函数. 通过子类的泛型定义取得对象类型      */     @SuppressWarnings("unchecked")     public BaseDaoImpl()//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。 this.persistentClass=(Class<T>)getSuperClassGenricType(getClass(), 0);     }    /**     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.     *      *@param clazz     *            clazz The class to introspect     * @param index     *            the Index of the generic ddeclaration,start from 0.     * @return the index generic declaration, or Object.class if cannot be     *         determined     */    @SuppressWarnings("unchecked")    public static Class<Object> getSuperClassGenricType(final Class clazz, final int index) {          //返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。        Type genType = clazz.getGenericSuperclass();        if (!(genType instanceof ParameterizedType)) {           return Object.class;        }        //返回表示此类型实际类型参数的 Type 对象的数组。        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();        if (index >= params.length || index < 0) {                     return Object.class;        }        if (!(params[index] instanceof Class)) {              return Object.class;        }        return (Class) params[index];    }}


 

具体再Hibernate使用如下:

1、IBaseDao.java

package org.nercita.core.orm;import java.io.Serializable;import java.util.List;import java.util.Map;import org.nercita.core.search.Search;/** * 针对单个实体对象的操作定义.不依赖于具体ORM实现方案. * @author zhangwenchao * @param <T> 实体 * @param <PK> 主键类型 *  */public interface IBaseDao<T, PK extends Serializable> {  /**  * 根据Id查询实体  * @param id  * @return 实体对象  */ T findById(PK id);   /**  * 根据Id查询实体  * @param id  * @return 实体对象  */ T getById(PK id);   /**  * 根据id查询实体,并加锁  * @param id   * @return 实体对象  */ public T findByIdForLock(PK id);  /**  * 根据id查询实体,并加锁  * @param id   * @return 实体对象  */ public T getByIdForLock(final PK id);   /**  * 保存实体  * @param entity 实体对象  */ void save(T entity);   /**  * 更新实体  * @param entity 实体对象  */ void update(T entity);   /**  * 更新实体  * @param entity 实体对象  */ void saveOrUpdate(T entity);   /**  * 删除实体  * @param entity 实体对象  */ void delete(T entity);    /**  * 根据hql执行语句,用于批量更新删除  * @param queryString hql语句  * @param values 可变参数  * @return 影响的个数  */ public int execute(String queryString, Object... values);   /**  * 根据Id删除实体  * @param id   */ void deleteById(PK id);   /**  * 查询所有实体  * @return List 查询结果集  */ List<T> findAll();   /**  * 根据条件模糊查询所有实体  * @param queryName 要查询的列名  * @param queryValue 要查询的值  * @return List 查询结果集  */ List<T> findAllLike(String queryName, Object queryValue);   /**  * 根据条件精确查询所有实体  * @param queryName 要查询的列名  * @param queryValue 要查询的值  * @return List 查询结果集  */ List<T> findAllEq(String queryName, Object queryValue);   /**  * 分页查询所有实体  * @param page 分页条件  * @return Page 分页查询结果,附带结果列表及所有查询时的参数.<br>  *     可通过page.getResult()获取.  */ Page<T> findPage(Page<T> page);    /**  * 按属性查找唯一对象.  * @param propertyName 要查询的列名  * @param value 要查询的值(精确查询)  * @return 实体对象  */ public T findUniqueByProperty(String propertyName, Object value);    /**  * 根据单个查询条件分页(精确查询)  * @param page 分页参数  * @param queryName 要查询的列名  * @param queryValue 要查询的值  * @return Page 分页查询结果.  */ public Page<T> findPageByPropertyExact(Page<T> page, String queryName, Object queryValue);    /**  * 根据单个查询条件分页(模糊查询)  * @param page 分页参数  * @param queryName 要查询的列名  * @param queryValue 要查询的值  * @return Page 分页查询结果.  */ public Page<T> findPageByPropertyLike(Page<T> page, String queryName, Object queryValue);    /**  * 根据查询条件分页查询(模糊查询)  * @param page 分页参数  * @param entity 查询实体,设置了要查询的条件  * @return Page 分页查询结果.  */ public Page<T> findPageByQuerysBlur(Page<T> page, T entity);    /**  * 根据查询条件分页查询(精确查询)  * @param page 分页参数  * @param entity 查询实体,设置了要查询的条件  * @return Page 分页查询结果.  */ public Page<T> findPageByQuerysExact(Page<T> page, T entity);    /**  * 根据查询条件分页查询(模糊查询)  * @param page 分页参数  * @param queryMap 查询条件,在map中以键、值对保存  * @return Page 分页查询结果.  */  @SuppressWarnings("rawtypes") public Page<T> findPageByMap(Page<T> page, Map queryMap);    /**  * 根据查询构建器查询所有记录  * @param search 查询构建器  * @return List  */ public List<T> search(Search search);    /**  * 根据查询构建器查询Page  * @param page 分页参数  * @param search 查询构建器  * @return Page  */ public Page<T> search(Page<T> page, Search search); }


2、HibernateGenericDao.java

package org.nercita.core.orm.hibernate;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedHashSet;import java.util.List;import java.util.Map;import java.util.Set;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.annotation.Resource;import javax.persistence.ManyToOne;import javax.persistence.OneToOne;import org.apache.commons.lang.StringEscapeUtils;import org.hibernate.Criteria;import org.hibernate.Hibernate;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.criterion.CriteriaSpecification;import org.hibernate.criterion.Criterion;import org.hibernate.criterion.Projection;import org.hibernate.criterion.Projections;import org.hibernate.hql.internal.ast.QueryTranslatorImpl;import org.hibernate.internal.CriteriaImpl;import org.hibernate.transform.ResultTransformer;/** * Hibernate DAO 操作工具类, 封装了基本操作.  * @author zhangwenchao */public class HibernateGenericDao {  /**  * DAO所管理的Entity类型.  */ @SuppressWarnings("rawtypes") protected Class entityClass; @Resource(name = "sessionFactory") protected SessionFactory sessionFactory; /**  * 获取当前session  * @return Session  */ public Session getSession() {  return sessionFactory.getCurrentSession(); }  /**  * 获取当前sessionFactory  * @return sessionFactory  */ public SessionFactory getSessionFactory() {  return sessionFactory; }  @SuppressWarnings("rawtypes") public void setEntityClass(Class entityClass){  this.entityClass = entityClass; }  /**  * 刷新session  */ public void flush() {        getSession().flush();    } /**  * 清空session  */    public void clear() {        getSession().clear();    }            /**     * 根据sql创建Query     * @param queryString sql语句, 参数必须用"?"设置     * @param values 可变参数, 对应查询语句里的" ? "     * @return Query Query对象     */    public Query createSqlQuery(String queryString, Object... values) {  Query queryObject = getSession().createSQLQuery(queryString);  if (values != null) {   for (int i = 0; i < values.length; i++) {    queryObject.setParameter(i, values[i]);   }  }  return queryObject; }   /**  * 根据查询函数与参数列表创建Query对象,后续可进行更多处理.<br>  * 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.  *   * @param queryString HQL查询语句, 参数必须用"?"设置  * @param values 可变参数, 对应查询语句里的" ? "  * @return Query Query对象  */ public Query createQuery(String queryString, Object... values) {  Query queryObject = getSession().createQuery(queryString);  if (values != null) {   for (int i = 0; i < values.length; i++) {    queryObject.setParameter(i, values[i]);   }  }  return queryObject; }  /**  * 根据Criterion条件创建Criteria,后续可进行更多处理.  * @param criterions 可变的Restrictions条件列表, 封装了查询条件  * @return Criteria Criteria对象  */ public Criteria createCriteria(Criterion... criterions) {  Criteria criteria = getSession().createCriteria(entityClass);  Map<String, String> aliasMap = new HashMap<String, String>();  for (Criterion c : criterions) {   String propertyName = null;   try {    propertyName = getFieldValue(c, "propertyName").toString();    if (propertyName!=null) {     String[] paramStrs = propertyName.split("\\.");     if(paramStrs.length > 1){      String alias = paramStrs[0];      Field f  = entityClass.getDeclaredField(alias);      if(isRelatingObject(f)){       String param = paramStrs[1];       String identifier = getIdentifierName(f.getType());       if(!identifier.equals(param)){        if(criteria instanceof CriteriaImpl){         aliasMap.put(alias, alias);        }       }      }     }    }   } catch (NoSuchFieldException e) {    //没有propertyName属性,直接跳出   }   criteria.add(c);  }  Iterator<String> iterator = aliasMap.values().iterator();  while (iterator.hasNext()) {   String alias = iterator.next();   criteria.createAlias(alias, alias);  }  return criteria; }   /**  * 根据Criterion条件创建Criteria,后续可进行更多处理.  * @param criterions 可变的Restrictions条件列表, 封装了查询条件  * @return Criteria Criteria对象  */ public Criteria createCriteria(List<Criterion> criterions) {  Criteria criteria = getSession().createCriteria(entityClass);  Map<String, String> aliasMap = new HashMap<String, String>();  for (Criterion c : criterions) {   String propertyName = null;   try {    propertyName = getFieldValue(c, "propertyName").toString();    if (propertyName!=null) {     String[] paramStrs = propertyName.split("\\.");     if(paramStrs.length > 1){      String alias = paramStrs[0];      Field f  = entityClass.getDeclaredField(alias);      if(isRelatingObject(f)){       String param = paramStrs[1];       String identifier = getIdentifierName(f.getType());       if(!identifier.equals(param)){        if(criteria instanceof CriteriaImpl){         aliasMap.put(alias, alias);        }       }      }     }    }    } catch (NoSuchFieldException e) {    //没有propertyName属性,直接跳出   }      criteria.add(c);  }  Iterator<String> iterator = aliasMap.values().iterator();  while (iterator.hasNext()) {   String alias = iterator.next();   criteria.createAlias(alias, alias);  }  return criteria; }        /**  * 按HQL查询对象列表.  * @param hql hql语句, 参数必须用"?"设置  * @param values 可变参数, 对应查询语句里的" ? "  * @return List 查询出的对象类表  */ @SuppressWarnings("rawtypes") public List findByHql(String hql, Object... values) {  return createQuery(hql, values).list(); }   /**  * 按Criterion查询对象列表.  * @param criterion 数量可变的Criterion.  * @return List 查询出的对象类表  */ @SuppressWarnings("rawtypes") public List findByCriteria(Criterion... criterion) {  return createCriteria(criterion).list(); }     /**  * 按HQL查询唯一对象.  * @param hql HQL语句, 参数必须用"?"设置  * @param values 可变参数, 对应查询语句里的" ? "  * @return Object 查询出的唯一对象  */ public Object findUnique(String hql, Object... values) {  return createQuery(hql, values).uniqueResult(); }   /**  * 按Criteria查询唯一对象.  * @param criterion 数量可变的Criterion.  * @return Object 查询出的唯一对象  */ public Object findUnique(Criterion... criterion) {  return createCriteria(criterion).uniqueResult(); }  /**  * 按HQL查询Intger类形结果,不能用于count查询,count查询可使用findUniqueLong.    * @param hql HQL语句, 参数必须用"?"设置  * @param values 可变参数, 对应查询语句里的" ? "  */ public Integer findUniqueInt(String hql, Object... values) {  return (Integer) findUnique(hql, values); }  /**  * 按HQL查询Long类型结果,可用于count查询.     * @param hql HQL语句, 参数必须用"?"设置  * @param values 可变参数, 对应查询语句里的" ? "  */ public Long findUniqueLong(String hql, Object... values) {  return (Long) findUnique(hql, values); }   /**  * 初始化对象.  * 使用load()方法得到的仅是对象Proxy后, 在传到View层前需要进行初始化.  * initObject(user) ,初始化User的直接属性,但不会初始化延迟加载的关联集合和属性.  * initObject(user.getRoles()),初始化User的直接属性和关联集合.  * initObject(user.getDescription()),初始化User的直接属性和延迟加载的Description属性.  */ public void initObject(Object object) {  Hibernate.initialize(object); } /**  * 批量初始化对象.  * @see #initObject(Object)  */ @SuppressWarnings("rawtypes") public void initObjects(List list) {  for (Object object : list) {   Hibernate.initialize(object);  } } /**  * 通过Set将不唯一的对象列表唯一化.  * 主要用于HQL/Criteria预加载关联集合形成重复记录,又不方便使用distinct查询语句时.  */ public <X> List<X> distinct(List<X> list) {  Set<X> set = new LinkedHashSet<X>(list);  return new ArrayList<X>(set); } public Query distinct(Query query) {  query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);  return query; } public Criteria distinct(Criteria c) {  c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);  return c; }  /**     * 获取当前实体的主键名称     * @param entityClass 实体类     * @return 主键字段名     */    public String getIdentifierName(){     return getSessionFactory().getClassMetadata(entityClass).getIdentifierPropertyName();    }        /**     * 获取给定实体的主键名称     * @param entityClass 实体类     * @return 主键字段名     */    @SuppressWarnings("rawtypes") public String getIdentifierName(Class entityClass){     return getSessionFactory().getClassMetadata(entityClass).getIdentifierPropertyName();    }   /**  * 去除hql的select 子句,未考虑union的情况,用于pagedQuery.  * @param hql HQL语句,只限于单实体查询  */ public String removeSelect(String hql) {  int beginPos = hql.toLowerCase().indexOf("from");  return hql.substring(beginPos); }   /**  * 去除hql的orderby 子句,用于pagedQuery.  * @param hql HQL语句  */ public String removeOrders(String hql) {  Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);  Matcher m = p.matcher(hql);  StringBuffer sb = new StringBuffer();  while (m.find()) {   m.appendReplacement(sb, "");  }  m.appendTail(sb);  return sb.toString(); }    /**  * 过滤sql语句,防止注入  * @param hql SQL语句  */ public String replaceInject(String hql) {  return StringEscapeUtils.escapeSql(hql); }    /**  * 将hql查询语句转化成count(*)统计结果集语句  * @param hql HQL语句  */ public String replaceCountHql(String hql) {  return "select count(*) " + removeOrders(removeSelect(hql)); }    /**  * 将hql转化为count(*) sql语句  * @param originalHql hql语句  * @return sql语句  */ public String getCountSql(String originalHql) {   QueryTranslatorImpl queryTranslator = new QueryTranslatorImpl(originalHql, originalHql,   Collections.EMPTY_MAP, (org.hibernate.engine.spi.SessionFactoryImplementor)getSessionFactory());   queryTranslator.compile(Collections.EMPTY_MAP, false);   return "select count(*) from (" + queryTranslator.getSQLString() + ") tmp_count_t";  }   /**  * 通过count查询获得本次查询所能获得的对象总数.  * @param c Criteria 查询条件  * @return int 结果总数  */ @SuppressWarnings({ "unchecked", "rawtypes" }) public long getCountByCriteria(Criteria c) {  CriteriaImpl impl = (CriteriaImpl) c;  // 先把Projection、ResultTransformer、OrderBy取出来,清空三者后再执行Count操作  Projection projection = impl.getProjection();  ResultTransformer transformer = impl.getResultTransformer();  List<CriteriaImpl.OrderEntry> orderEntries = null;  try {   orderEntries = (List) getFieldValue(impl, "orderEntries");   setFieldValue(impl, "orderEntries", new ArrayList());  } catch (NoSuchFieldException e) {   e.printStackTrace();  }   // 执行Count查询  long totalCount = (Long) c.setProjection(Projections.rowCount()).uniqueResult();  if (totalCount < 0)   return -1;  // 将之前的ProjectionOrderBy条件重新设回去  c.setProjection(projection);  if (projection == null) {   c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);  }  if (transformer != null) {   c.setResultTransformer(transformer);  }  try {   setFieldValue(impl, "orderEntries", orderEntries);  } catch (NoSuchFieldException e) {   e.printStackTrace();  }  return totalCount; }   /**  * 直接读取对象属性值,无视private/protected修饰符,不经过getter函数.  * @throws NoSuchFieldException   */ protected Object getFieldValue(Object object, String fieldName) throws NoSuchFieldException {  Field field = getDeclaredField(object, fieldName);  if (!field.isAccessible()) {   field.setAccessible(true);  }  Object result = null;  try {   result = field.get(object);  } catch (Exception e) {   e.printStackTrace();  }  return result; }    /**  * 循环向上转型,获取对象的DeclaredField.  * @throws NoSuchFieldException   */ protected Field getDeclaredField(Object object, String fieldName) throws NoSuchFieldException {  return getDeclaredField(object.getClass(), fieldName); }    /**  * 循环向上转型,获取类的DeclaredField.  */ @SuppressWarnings("rawtypes") protected Field getDeclaredField(Class clazz, String fieldName) throws NoSuchFieldException {  for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {   try {    return superClass.getDeclaredField(fieldName);   } catch (NoSuchFieldException e) {    // Field不在当前类定义,继续向上转型   }  }  throw new NoSuchFieldException("No such field: " + clazz.getName() + '.' + fieldName); }    /**  * 直接设置对象属性值,无视private/protected修饰符,不经过setter函数.  * @throws NoSuchFieldException   */ protected void setFieldValue(Object object, String fieldName, Object value) throws NoSuchFieldException {  Field field = getDeclaredField(object, fieldName);  if (!field.isAccessible()) {   field.setAccessible(true);  }  try {   field.set(object, value);  } catch (Exception e) {   e.printStackTrace();  } }  /**  * 判断此字段是否是多对一或者一对一关联  * @param field 字段名称  * @return “是”则返回true  */ protected boolean isRelatingObject(Field field){  return field.isAnnotationPresent(ManyToOne.class) || field.isAnnotationPresent(OneToOne.class); } }


 

3、HibernateBaseDao.java

package org.nercita.core.orm.hibernate;import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.hibernate.Criteria;import org.hibernate.LockOptions;import org.hibernate.Query;import org.hibernate.criterion.Criterion;import org.hibernate.criterion.Example;import org.hibernate.criterion.Junction;import org.hibernate.criterion.MatchMode;import org.hibernate.criterion.Order;import org.hibernate.criterion.Restrictions;import org.nercita.core.orm.IBaseDao;import org.nercita.core.orm.Page;import org.nercita.core.search.Filter;import org.nercita.core.search.Search;import org.nercita.core.search.Sort;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Assert;/** * 负责为单个Entity对象提供CRUD操作的Hibernate DAO基类.<p/> *  * 子类只要在类定义时指定所管理Entity的Class, 即拥有对单个Entity对象的CRUD操作. *  * @author zhangwenchao  * @param <T>  DAO操作的对象类型 * @param <PK>  主键类型  * @see org.nercita.core.orm.hibernate.HibernateGenericDao */@SuppressWarnings("unchecked")public class HibernateBaseDao<T, PK extends Serializable> extends  HibernateGenericDao implements IBaseDao<T, PK> { protected Logger logger = LoggerFactory.getLogger(getClass()); public HibernateBaseDao() {  if(this.entityClass == null){   this.entityClass = (Class<T>) ((ParameterizedType) getClass()     .getGenericSuperclass()).getActualTypeArguments()[0];  } } protected Class<T> getEntityClass() {  return entityClass; }   public T findById(final PK id) {  Assert.notNull(id, "id不能为空");     return (T) getSession().load(getEntityClass(), id);     }  public T getById(final PK id) {  Assert.notNull(id, "id不能为空");  return (T) getSession().get(getEntityClass(), id);   }  public T findByIdForLock(final PK id) {  Assert.notNull(id, "id不能为空");  return (T) getSession().load(getEntityClass(), id, LockOptions.UPGRADE); }  public T getByIdForLock(final PK id) {  Assert.notNull(id, "id不能为空");  return (T) getSession().get(getEntityClass(), id, LockOptions.UPGRADE); } public void save(final T entity) {  Assert.notNull(entity, "entity不能为空");  getSession().save(entity);  logger.info("save entity: {}", entity); }  /**  * 保存实体列表  * @param entity 实体列表对象  */ public void save(final List<T> entities){  Assert.notNull(entities, "entities不能为空");  for(int i=0;i<entities.size();i++)      getSession().save(entities.get(i));  logger.info("save entities: {}", entities); }  public void update(final T entity) {  Assert.notNull(entity, "entity不能为空");  getSession().update(entity);  logger.info("update entity: {}", entity); }  public void saveOrUpdate(final T entity) {  Assert.notNull(entity, "entity不能为空");  getSession().saveOrUpdate(entity);  logger.debug("save entity: {}", entity); } public void merge(final T entity) {  Assert.notNull(entity, "entity不能为空");  getSession().merge(entity);  logger.debug("save entity: {}", entity); }  public void delete(final T entity) {  Assert.notNull(entity, "entity不能为空");  getSession().delete(entity);  logger.info("delete entity: {}", entity); }  /**  * 批量删除实体列表  * @param entity 实体对象列表  */ public void delete(List<T> entities){  Assert.notNull(entities, "entity不能为空");  for(int i=0;i<entities.size();i++)  getSession().delete(entities.get(i));  logger.info("delete entities: {}", entities); }  public void deleteById(final PK id) {  Assert.notNull(id, "id不能为空");  delete(findById(id));  logger.info("delete entity {}, id is {}", entityClass.getSimpleName() , id); }  public int execute(final String queryString, final Object... values){  Assert.hasText(queryString, "queryString不能为空");  return createQuery(queryString, values).executeUpdate();  }    public List<T> findAll() {  return findByCriteria(); }  public List<T> findAllLike(String queryName, Object queryValue) {  Criterion criterion = Restrictions.like(queryName, queryValue);  return findAll(criterion); }  public List<T> findAllEq(String queryName, Object queryValue) {  Criterion criterion = Restrictions.eq(queryName, queryValue);  return findAll(criterion); }   public List<T> findAll(Criterion... criterion) {  return findByCriteria(criterion); }   public Page<T> findPage(final Page<T> page) {  Assert.notNull(page, "page不能为空");  return findPageByCriteria(page); }   public T findUniqueByProperty(final String propertyName, final Object value) {  Assert.hasText(propertyName, "propertyName不能为空");  return (T) createCriteria(Restrictions.eq(propertyName, value)).uniqueResult(); }   /**  * 按HQL分页查询.  * 暂不支持自动获取总结果数,需用户另行执行查询.  * @param page 分页参数.包括pageSize 和firstResult.  * @param hql HQL查询语句, 参数必须用“?”设置.  * @param values 数量可变的参数, 对应查询语句里的“?”.  * @return 分页查询结果,附带结果列表及所有查询时的参数.  */ public Page<T> findPageByHql(Page<T> page, String hql, Object... values) {  Assert.notNull(page, "page不能为空");  Assert.hasText(hql, "hql不能为空");  long count = findCountByHql(hql, values);  if(count>-1)   page.setTotalCount((int)count);  Query q = createQuery(hql, values);  q.setFirstResult(page.getFirst());  q.setMaxResults(page.getPageSize());   page.setResult(q.list());  return page; }    public long findCountByHql(String hql, Object... values) {  if(hql.toLowerCase().indexOf("group by")>0 || hql.toLowerCase().indexOf(" distinct ")>0){   String sql = getCountSql(removeOrders(hql));   Query query = createSqlQuery(sql, values);   return Long.parseLong(query.uniqueResult().toString());  }else {   return findUniqueLong(replaceCountHql(hql), values);  } }   /**  * 根据查询条件分页查询  * @param page 分页参数  * @param entity 查询实体,设置了要查询的条件  * @param matchMode 查询的精确类型<br>  * MatchMode: EXACT-精确查询,ANYWHERE-模糊查询,START-开头匹配,END-结尾匹配  * @param criterion 数量可变的Criterion.  * @return Page 分页查询结果.  */ public Page<T> findPageByQuerys(Page<T> page, T entity, MatchMode matchMode, Criterion... criterion) {  Assert.notNull(page, "page不能为空");  Criteria c = createCriteria(criterion);  if(entity!=null){   Example example = Example.create(entity);   example.enableLike(matchMode);  //设置查询类型    c.add(example);  }  // 获取根据条件分页查询的总行数   page.setTotalCount(getCountByCriteria(c));  c.setFirstResult(page.getFirst());  c.setMaxResults(page.getPageSize());  if (page.isOrderBySetted()) {   String[] orderByArray = StringUtils.split(page.getOrderBy(), ',');   String[] orderArray = StringUtils.split(page.getOrder(), ',');   Assert.isTrue(orderByArray.length == orderArray.length, "分页多重排序参数中,排序字段与排序方向的个数不相等");   for (int i = 0; i < orderByArray.length; i++) {    if (Page.ASC.equals(orderArray[i])) {     c.addOrder(Order.asc(orderByArray[i]));    } else {     c.addOrder(Order.desc(orderByArray[i]));    }   }  }  page.setResult(c.list());  return page; } /**  * 根据查询条件分页查询  * @param page 分页参数  * @param entity 查询实体,设置了要查询的条件  * @param matchMode 查询的精确类型<br>  * MatchMode: EXACT-精确查询,ANYWHERE-模糊查询,START-开头匹配,END-结尾匹配  * @param criterion  Criterion List.  * @return Page 分页查询结果.  */ public Page<T> findPageByQuerys(Page<T> page, T entity, MatchMode matchMode, List<Criterion> criterion) {  Assert.notNull(page, "page不能为空");  Criteria c = createCriteria(criterion);  if(entity!=null){   Example example = Example.create(entity);   example.enableLike(matchMode);  //设置查询类型    c.add(example);  }  page.setTotalCount(getCountByCriteria(c));  c.setFirstResult(page.getFirst());  c.setMaxResults(page.getPageSize());  if (page.isOrderBySetted()) {   String[] orderByArray = StringUtils.split(page.getOrderBy(), ',');   String[] orderArray = StringUtils.split(page.getOrder(), ',');   Assert.isTrue(orderByArray.length == orderArray.length, "分页多重排序参数中,排序字段与排序方向的个数不相等");   for (int i = 0; i < orderByArray.length; i++) {    if (Page.ASC.equals(orderArray[i])) {     c.addOrder(Order.asc(orderByArray[i]));    } else {     c.addOrder(Order.desc(orderByArray[i]));    }   }  }  page.setResult(c.list());  return page; }    /**  * 按Criterion分页查询.  * @param page 分页参数  * @param criterion 数量可变的Criterion.  * @return 分页查询结果.附带结果列表及所有查询时的参数.  */ public Page<T> findPageByCriteria(Page<T> page, Criterion... criterion) {  return findPageByQuerys(page, null, null, criterion); }   /**  * 按Criterion分页查询.  * @param page 分页参数  * @param criterion Criterion List.  * @return 分页查询结果.附带结果列表及所有查询时的参数.  */ public Page<T> findPageByCriteria(Page<T> page, List<Criterion> criterion) {  return findPageByQuerys(page, null, null, criterion); }   /**  * 按Criterion查询结果数.  * @param criterion 数量可变的Criterion.  * @return 查询结果  */ public long findCountByCriteria(Criterion... criterion) {  Criteria c = createCriteria(criterion);  return getCountByCriteria(c); }   /**  * 根据查询条件分页查询  * @param page 分页参数  * @param entity 查询实体,设置了要查询的条件  * @param matchMode 查询的精确类型<br>  * MatchMode: EXACT-精确查询,ANYWHERE-模糊查询,START-开头匹配,END-结尾匹配  * @return Page 分页查询结果.  */ public Page<T> findPageByQueryMatch(Page<T> page, T entity, MatchMode matchMode) {  return findPageByQuerys(page, entity, matchMode); }  public Page<T> findPageByQuerysBlur(Page<T> page, T entity) {  return findPageByQuerys(page, entity, MatchMode.ANYWHERE); }   public Page<T> findPageByQuerysExact(Page<T> page, T entity) {  return findPageByQuerys(page, entity, MatchMode.EXACT); }    public Page<T> findPageByPropertyExact(Page<T> page, String queryName, Object queryValue) {  Criterion criterion = Restrictions.eq(queryName, queryValue);  return findPageByCriteria(page, criterion); }   public Page<T> findPageByPropertyLike(Page<T> page, String queryName, Object queryValue) {  Criterion criterion = Restrictions.like(queryName, "%"+queryValue+"%");  return findPageByCriteria(page, criterion); }    @SuppressWarnings("rawtypes") public Page<T> findPageByMap(Page<T> page, Map queryMap) {  Assert.notNull(page, "page不能为空");  Assert.notNull(queryMap, "queryMap不能为空");  StringBuffer hql = new StringBuffer("from ");  hql.append(getEntityClass().getName()).append(" where 1=1 ");  Iterator it = queryMap.keySet().iterator();           while (it.hasNext()) {             Object key = it.next();            hql.append(" and ").append(key.toString()).append(" like '%").append(replaceInject(String.valueOf(queryMap.get(key)))).append("%'");        }  return findPageByHql(page, hql.toString()); }   /**  * 根据查询构建器查询所有记录  * @param search 查询构建器  * @return List  */ public List<T> search(Search search) {  Assert.notNull(search, "search不能为空");  List<Criterion> criterionList = new ArrayList<Criterion>();  List<Filter> filters = search.getFilters();  for(Filter filter : filters){   if(!filter.getValue().equals("") && filter.getValue()!=null)   criterionList.add(filter.isSimpleFilter() ?      buildCriterionBySimFilter(filter) : buildCriterionByConnFilter(filter));  }  Criteria c = createCriteria(criterionList);  List<Sort> sorts = search.getSorts();  for(Sort sort : sorts){   if(sort.getOrder().equals(Sort.ASC)){    c.addOrder(Order.asc(sort.getProperty()));   }   if(sort.getOrder().equals(Sort.DESC)){    c.addOrder(Order.desc(sort.getProperty()));   }  }  return c.list(); }   /**  * 根据查询构建器查询Page  * @param page 分页参数  * @param search 查询构建器  * @return Page  */ public Page<T> search(Page<T> page, Search search) {  Assert.notNull(search, "search不能为空");  List<Criterion> criterionList = new ArrayList<Criterion>();  List<Filter> filters = search.getFilters();  for(Filter filter : filters){   if(!"".equals(filter.getValue()) && null != filter.getValue())   criterionList.add(filter.isSimpleFilter() ?      buildCriterionBySimFilter(filter) : buildCriterionByConnFilter(filter));  }  Criteria c = createCriteria(criterionList);  page.setTotalCount(getCountByCriteria(c));  c.setFirstResult(page.getFirst());  c.setMaxResults(page.getPageSize());  List<Sort> sorts = search.getSorts();  for(Sort sort : sorts){   if(sort.getOrder().equals(Sort.ASC)){    c.addOrder(Order.asc(sort.getProperty()));   }   if(sort.getOrder().equals(Sort.DESC)){    c.addOrder(Order.desc(sort.getProperty()));   }  }  page.setResult(c.list());  return page; }    /**  * 根据Filter构造过滤条件  */ public Criterion buildCriterionBySimFilter(Filter filter){  String propertyName = filter.getProperty();  Object value = filter.getValue();  int operator = filter.getOperator();  Criterion criterion = null;  switch (operator) {  case Filter.OP_EMPTY:   criterion = Restrictions.isEmpty(propertyName);   break;  case Filter.OP_EQUAL:   criterion = Restrictions.eq(propertyName, value);   break;  case Filter.OP_GREATER_OR_EQUAL:   criterion = Restrictions.ge(propertyName, value);   break;  case Filter.OP_GREATER_THAN:   criterion = Restrictions.gt(propertyName, value);   break;  case Filter.OP_ILIKE:   criterion = Restrictions.ilike(propertyName, "%"+value+"%");   break;  case Filter.OP_IN:   if(value instanceof Object[])    criterion = Restrictions.in(propertyName, (Object[])value);   if(value instanceof Collection<?>)    criterion = Restrictions.in(propertyName, (Collection<?>)value);   break;  case Filter.OP_LESS_OR_EQUAL:   criterion = Restrictions.le(propertyName, value);   break;  case Filter.OP_LESS_THAN:   criterion = Restrictions.lt(propertyName, value);   break;  case Filter.OP_LIKE:   criterion = Restrictions.like(propertyName, "%"+value+"%");   break;  case Filter.OP_NOT_EMPTY:   criterion = Restrictions.isNotEmpty(propertyName);   break;  case Filter.OP_NOT_EQUAL:   criterion = Restrictions.ne(propertyName, value);   break;  case Filter.OP_NOT_IN:   if(value instanceof Object[])    criterion = Restrictions.in(propertyName, (Object[])value);   if(value instanceof Collection<?>)    criterion = Restrictions.in(propertyName, (Collection<?>)value);   criterion = Restrictions.not(criterion);   break;  case Filter.OP_NOT_NULL:   criterion = Restrictions.isNotNull(propertyName);   break;  case Filter.OP_NULL:   criterion = Restrictions.isNull(propertyName);   break;  case Filter.OP_NOT:   Filter filterNot = (Filter) filter.getValue();   criterion = Restrictions.not(filterNot.isSimpleFilter() ?     buildCriterionBySimFilter(filterNot) : buildCriterionByConnFilter(filterNot));   break;  }  return criterion; }  /**  * 构造连接过滤条件  */ public Criterion buildCriterionByConnFilter(Filter filter){  Criterion criterion = null;  switch (filter.getOperator()) {  case Filter.OP_AND:   Junction andCri = Restrictions.conjunction();   List<Filter> andList = (List<Filter>) filter.getValue();   for(Filter f : andList){    andCri.add(f.isSimpleFilter() ?      buildCriterionBySimFilter(f) : buildCriterionByConnFilter(f));   }   criterion = andCri;   break;  case Filter.OP_OR:   Junction orCri = Restrictions.disjunction();   List<Filter> orList = (List<Filter>) filter.getValue();   for(Filter f : orList){    orCri.add(f.isSimpleFilter() ?      buildCriterionBySimFilter(f) : buildCriterionByConnFilter(f));   }   criterion = orCri;   break;  }  return criterion; }}


4、使用测试,UserDao.java

package org.nercita.ntp.system.dao;import java.util.Date;import java.util.List;import org.hibernate.Query;import org.hibernate.SQLQuery;import org.hibernate.transform.Transformers;import org.nercita.ntp.system.domain.User;import org.nercita.ntp.system.domain.reference.RoleType;import org.nercita.ntp.system.domain.reference.UserState;import org.nercita.ntp.system.domain.reference.UserType;import org.nercita.ntp.system.domain.vo.UserVo;import org.nercita.ntp.util.FilterDescriptor;import org.nercita.ntp.util.KendoPage;import org.nercita.ntp.util.SortDescriptor;import org.nercita.core.orm.hibernate.HibernateBaseDao;import org.springframework.stereotype.Repository;/** * 用户持久类 * @author zhangwenchao * */@Repository("userDao")public class UserDao extends HibernateBaseDao<User, String>{   /**  * 根据用户名密码查询用户  * @param name  * @param password  * @return  */ @SuppressWarnings("rawtypes") public User findByUsernameAndPassword(String name, String password) {  String hql = "FROM User u where u.name=? and u.password=? and u.userState="+UserState.Enable.getValue();  Query query = getSession().createQuery(hql)                   .setParameter(0, name)                   .setParameter(1, password);  List list = query.list();    if(list !=null && list.size()>0){   User u = (User)list.get(0);   return u;  }else{   return null;  }  }   /**  * 根据用户名密码查询用户  * @param name  * @param password  * @return  */ @SuppressWarnings("rawtypes") public User findByUsernameAndPasswordAndImei(String name, String password,String imei) {   String hql = "FROM User u where u.name=? and u.password=? and u.imei=? and u.userState="+UserState.Enable.getValue();  Query query = getSession().createQuery(hql)                   .setParameter(0, name)                   .setParameter(1, password)                   .setParameter(2, imei);  List list = query.list();    if(list !=null && list.size()>0){   User u = (User)list.get(0);   return u;  }else{   return null;  }  }        /**  * 根据用户账户查询用户  * @param userName  * @return  */ public User findByName(String userName) {    return findUniqueByProperty("name", userName); }  /**  * 查询一般用户列表  * @param page  * @return  */ public KendoPage<User> findPageByQuery(KendoPage<User> page) {      String hql = "FROM User u WHERE  u.userState=1";   if(page.getFilter()!=null && page.getFilter().size()!=0){    for(FilterDescriptor filter: page.getFilter()){        if(!hql.toLowerCase().contains("where")){      hql += " where ";       }else{          hql += " and ";          }    if(filter.getField().equals("name")){         hql += "  u.name like '%"+filter.getValue()+"%'";    }    if(filter.getField().equals("userGroup")){     hql += "  u.userGroup.name like '%"+filter.getValue()+"%'";    }   }  }     if(page.getSort()!=null && page.getSort().size()!=0){   for(SortDescriptor sort: page.getSort()){    if(!hql.toLowerCase().contains("order by")){     hql += " order by ";    }else{     hql += ", ";    }       //如需对前台field中字段进行重命名则需在此进行判断调整    if( sort.getField().equals("name")){     hql += " u.name "+ sort.getDir()+ " ";    }else if( sort.getField().equals("groupName")){     hql += " u.groupName.name " +  sort.getDir()+ " ";    }else{     hql += " u."+sort.getField() + " " + sort.getDir();    }          }     }else{   hql += " order by u.name asc";  }  return (KendoPage<User>) findPageByHql(page, hql); } /**  * 查询所有系统用户列表  * @param page  * @return  */ public KendoPage<User> findSystemUserPageByQuery(KendoPage<User> page, User user) {  String hql = "FROM User u WHERE  u.name <> 'admin' ";  if(user.getUserType() == UserType.System){   hql += "and u.userType = "+UserType.System.getValue();  }else{   hql += "and u.id = '"+user.getId()+"' and u.userType = "+UserType.System.getValue();  }  if(page.getFilter()!=null && page.getFilter().size()!=0){    for(FilterDescriptor filter: page.getFilter()){    if(!hql.toLowerCase().contains("where")){      hql += " where ";       }else{          hql += " and ";          }    if(filter.getField().equals("name")){         hql += "  u.name like '%"+filter.getValue()+"%'";    }else if(filter.getField().equals("userGroup")){     hql += "  u.userGroup.name like '%"+filter.getValue()+"%'";    }else{     hql += " u."+filter.getField()+" like '%"+filter.getValue()+"%'";    }           }  }     if(page.getSort()!=null && page.getSort().size()!=0){   for(SortDescriptor sort: page.getSort()){    if(!hql.toLowerCase().contains("order by")){     hql += " order by ";    }else{     hql += ", ";    }       //如需对前台field中字段进行重命名则需在此进行判断调整    if( sort.getField().equals("name")){     hql += " u.name "+ sort.getDir()+ " ";    }else if( sort.getField().equals("groupName")){     hql += " u.groupName.name " +  sort.getDir()+ " ";    }else{     hql += " u."+sort.getField() + " " + sort.getDir();    }          }     }else{   hql += " order by u.name asc";  }  return (KendoPage<User>) findPageByHql(page, hql); }   }

 

 
 

 

 

           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值