com.hyzy.core.orm.hibernate.HibernateDao.java Source code

Java tutorial

Introduction

Here is the source code for com.hyzy.core.orm.hibernate.HibernateDao.java

Source

/**
 * Copyright (c) 2005-2010 springside.org.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * 
 * $Id: HibernateDao.java 1205 2010-09-09 15:12:17Z calvinxiu $
 */
package com.hyzy.core.orm.hibernate;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.persistence.Entity;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.compass.gps.device.hibernate.HibernateSyncTransactionFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.impl.CriteriaImpl;
import org.hibernate.property.ChainedPropertyAccessor;
import org.hibernate.property.PropertyAccessor;
import org.hibernate.property.PropertyAccessorFactory;
import org.hibernate.property.Setter;
import org.hibernate.transform.ResultTransformer;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import com.hyzy.core.bean.QueryResult;
import com.hyzy.core.orm.Page;
import com.hyzy.core.orm.PropertyFilter;
import com.hyzy.core.orm.PropertyFilter.MatchType;
import com.hyzy.core.utils.ClassUtils;
import com.hyzy.core.utils.SQLColumnToBean;
import com.hyzy.core.utils.reflection.ReflectionUtils;

/**
 * ?SpringSideHibernat DAO.
 * 
 * ,?.
 * ?Service,?DAO?,?.
 * 
 * @param <T> DAO?
 * @param <PK> 
 * 
 * @author calvin
 */
public class HibernateDao<T, PK extends Serializable> extends SimpleHibernateDao<T, PK> {

    /**
     * Dao?.
     * ??Class.
     * eg.
     * public class UserDao extends HibernateDao<User, Long>{
     * }
     */
    public HibernateDao() {
        super();
    }

    /**
     * ?Dao, ServiceHibernateDao.
     * Class.
     * eg.
     * HibernateDao<User, Long> userDao = new HibernateDao<User, Long>(sessionFactory, User.class);
     */
    public HibernateDao(final SessionFactory sessionFactory, final Class<T> entityClass) {
        super(sessionFactory, entityClass);
    }

    //--  --//

    /**
     * ?.
     */
    public Page<T> getAll(final Page<T> page) {
        return findPage(page);
    }

    /**
     * HQL.
     * 
     * @param page ?. ???orderBy?.
     * @param hql hql?.
     * @param values ????,?.
     * 
     * @return , ??.
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Page<T> findPage(final Page<T> page, final String hql, final Object... values) {
        Assert.notNull(page, "page?");

        Query q = createQuery(hql, values);

        if (page.isAutoCount()) {
            long totalCount = countHqlResult(hql, values);
            page.setTotalCount(totalCount);
        }

        setPageParameterToQuery(q, page);

        List result = q.list();
        page.setResult(result);
        return page;
    }

    /**
     * HQL.
     * 
     * @param page ?. ???orderBy?.
     * @param hql hql?.
     * @param values ???,??.
     * 
     * @return , ??.
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Page<T> findPage(final Page<T> page, final String hql, final Map<String, ?> values) {
        Assert.notNull(page, "page?");

        Query q = createQuery(hql, values);

        if (page.isAutoCount()) {
            long totalCount = countHqlResult(hql, values);
            page.setTotalCount(totalCount);
        }

        setPageParameterToQuery(q, page);

        List result = q.list();
        page.setResult(result);
        return page;
    }

    /**
     * Criteria.
     * 
     * @param page ?.
     * @param criterions ???Criterion.
     * 
     * @return .??.
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Page<T> findPage(final Page<T> page, final Criterion... criterions) {
        Assert.notNull(page, "page?");

        Criteria c = createCriteria(criterions);

        if (page.isAutoCount()) {
            long totalCount = countCriteriaResult(c);
            page.setTotalCount(totalCount);
        }

        setPageParameterToCriteria(c, page);

        List result = c.list();
        page.setResult(result);
        return page;
    }

    /**
     * Criteria.
     * 
     * @param page ?.
     * @param criterions ???Criterion.
     * 
     * @return .??.
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Page<T> findPage(final Page<T> page, final String[] aliasBeans, final Criterion... criterions) {
        Assert.notNull(page, "page?");

        Criteria c = createCriteria(criterions);
        c = createAlias(c, aliasBeans);

        if (page.isAutoCount()) {
            long totalCount = countCriteriaResult(c);
            page.setTotalCount(totalCount);
        }

        setPageParameterToCriteria(c, page);

        List result = c.list();
        page.setResult(result);
        return page;
    }

    /**
     * ?Query,.
     */
    protected Query setPageParameterToQuery(final Query q, final Page<T> page) {

        Assert.isTrue(page.getPageSize() > 0, "Page Size must larger than zero");

        //hibernatefirstResult??0
        q.setFirstResult(page.getFirst() - 1);
        q.setMaxResults(page.getPageSize());
        return q;
    }

    /**
     * ?Criteria,.
     */
    protected Criteria setPageParameterToCriteria(final Criteria c, final Page<T> page) {

        //Assert.isTrue(page.getPageSize() > 0, "Page Size must larger than zero");

        if (page.getFirst() != -1 && page.getPageSize() != -1) {
            //hibernatefirstResult??0
            c.setFirstResult(page.getFirst() - 1);
            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]));
                }
            }
        }
        return c;
    }

    /**
     * countHql.
     * 
     * ???hql?,??hql?count?.
     */
    protected long countHqlResult(final String hql, final Object... values) {
        String countHql = prepareCountHql(hql);

        try {
            Long count = findUnique(countHql, values);
            return count;
        } catch (Exception e) {
            throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e);
        }
    }

    /**
     * countHql.
     * 
     * ???hql?,??hql?count?.
     */
    protected long countHqlResult(final String hql, final Map<String, ?> values) {
        String countHql = prepareCountHql(hql);

        try {
            Long count = findUnique(countHql, values);
            return count;
        } catch (Exception e) {
            throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e);
        }
    }

    private String prepareCountHql(String orgHql) {
        String fromHql = orgHql;
        //select??order by???count,?.
        fromHql = "from " + StringUtils.substringAfter(fromHql, "from");
        fromHql = StringUtils.substringBefore(fromHql, "order by");

        String countHql = "select count(*) " + fromHql;
        return countHql;
    }

    /**
     * countCriteria.
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    protected long countCriteriaResult(final 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) ReflectionUtils.getFieldValue(impl, "orderEntries");
            ReflectionUtils.setFieldValue(impl, "orderEntries", new ArrayList());
        } catch (Exception e) {
            logger.error("??:{}", e.getMessage());
        }

        // Count
        Long totalCountObject = 0l;
        try {
            totalCountObject = (Long) c.setProjection(Projections.rowCount()).uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
        long totalCount = (totalCountObject != null) ? totalCountObject : 0;

        // ?Projection,ResultTransformerOrderBy??
        c.setProjection(projection);

        if (projection == null) {
            c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
        }
        if (transformer != null) {
            c.setResultTransformer(transformer);
        }
        try {
            ReflectionUtils.setFieldValue(impl, "orderEntries", orderEntries);
        } catch (Exception e) {
            logger.error("??:{}", e.getMessage());
        }

        return totalCount;
    }

    //-- ?(PropertyFilter) --//

    /**
     * ,????.
     * 
     * @param matchType ??,????PropertyFilterMatcheType enum.
     */
    public List<T> findBy(final String propertyName, final Object value, final MatchType matchType) {
        Criterion criterion = buildCriterion(propertyName, value, matchType);
        return find(criterion);
    }

    /**
     * ?.
     */
    public List<T> find(List<PropertyFilter> filters) {
        Criterion[] criterions = buildCriterionByPropertyFilter(filters);
        return find(criterions);
    }

    /**
     * ?.
     */
    public Long countResult(List<PropertyFilter> filters) {
        Criterion[] criterions = buildCriterionByPropertyFilter(filters);
        Criteria c = createCriteria(criterions);
        return countCriteriaResult(c);
    }

    /**
     * add by wucong
     * ?  ?
     * @param filters
     * @param orderByProperty
     * @param isAsc
     * @return
     */
    public List<T> find(List<PropertyFilter> filters, String orderByProperty, boolean isAsc) {
        Criterion[] criterions = buildCriterionByPropertyFilter(filters);
        return find(orderByProperty, isAsc, criterions);
    }

    /**
     * ?.
     * ??
     */
    public List<T> find(List<PropertyFilter> filters, final String[] alias) {
        Criterion[] criterions = buildCriterionByPropertyFilter(filters);
        return find(alias, criterions);
    }

    /**
     * ?.
     */
    public Page<T> findPage(final Page<T> page, final List<PropertyFilter> filters) {
        Criterion[] criterions = buildCriterionByPropertyFilter(filters);
        return findPage(page, criterions);
    }

    /**
     * ?.
     *   ??
     */
    public Page<T> findPage(final Page<T> page, final List<PropertyFilter> filters, final String[] aliasBeans) {

        Criterion[] criterions = buildCriterionByPropertyFilter(filters);

        return findPage(page, aliasBeans, criterions);
    }

    /**
     * ??Criterion,.
     */
    protected Criterion buildCriterion(final String propertyName, final Object propertyValue,
            final MatchType matchType) {
        Assert.hasText(propertyName, "propertyName?");
        Criterion criterion = null;
        //?MatchTypecriterion
        switch (matchType) {
        case EQ:
            criterion = Restrictions.eq(propertyName, propertyValue);
            break;
        case LIKE:
            criterion = Restrictions.like(propertyName, (String) propertyValue, MatchMode.ANYWHERE);
            break;
        case LIKEEXACT:
            criterion = Restrictions.like(propertyName, (String) propertyValue, MatchMode.EXACT);
            break;
        case LIKESTART:
            criterion = Restrictions.like(propertyName, (String) propertyValue, MatchMode.START);
            break;
        case LIKEEND:
            criterion = Restrictions.like(propertyName, (String) propertyValue, MatchMode.END);
            break;
        case LE:
            criterion = Restrictions.le(propertyName, propertyValue);
            break;
        case LT:
            criterion = Restrictions.lt(propertyName, propertyValue);
            break;
        case GE:
            criterion = Restrictions.ge(propertyName, propertyValue);
            break;
        case GT:
            criterion = Restrictions.gt(propertyName, propertyValue);
            break;
        case NEQ:
            criterion = Restrictions.ne(propertyName, propertyValue);
            break;
        case ISN:
            criterion = Restrictions.isNull(propertyName);
            break;
        case ISNN:
            criterion = Restrictions.isNotNull(propertyName);
            break;
        case IN:
            criterion = Restrictions.in(propertyName, (Object[]) propertyValue);
            break;

        }
        return criterion;
    }

    /**
     * ?Criterion,.
     */
    protected Criterion[] buildCriterionByPropertyFilter(final List<PropertyFilter> filters) {
        List<Criterion> criterionList = new ArrayList<Criterion>();
        for (PropertyFilter filter : filters) {
            /*if (!filter.hasMultiProperties()) { //??.
               Criterion criterion = buildCriterion(filter.getPropertyName(), filter.getMatchValue(), filter
              .getMatchType());
               criterionList.add(criterion);
            } else {//??,or?.
               Disjunction disjunction = Restrictions.disjunction();
               for (String param : filter.getPropertyNames()) {
                  Criterion criterion = buildCriterion(param, filter.getMatchValue(), filter.getMatchType());
                  disjunction.add(criterion);
               }
               criterionList.add(disjunction);
            }*/
            //update by wucong
            //  System.out.println("+++++++++++++++++++++++++++++++++++++++filter:"+filter);
            if (filter == null)
                continue;
            if (!filter.hasMultiProperties()) { //??.
                Disjunction disjunction = Restrictions.disjunction();
                for (Object matchValue : filter.getMatchValues()) {
                    Criterion criterion = buildCriterion(filter.getPropertyName(), matchValue,
                            filter.getMatchType());
                    disjunction.add(criterion);
                }
                criterionList.add(disjunction);
            } else {//??,or?.
                Disjunction disjunction = Restrictions.disjunction();
                for (String param : filter.getPropertyNames()) {
                    for (Object matchValue : filter.getMatchValues()) {
                        Criterion criterion = buildCriterion(param, matchValue, filter.getMatchType());
                        disjunction.add(criterion);
                    }
                }
                criterionList.add(disjunction);
            }
        }
        //?
        //      criterionList.add(Restrictions.gt("status", -100) );
        return criterionList.toArray(new Criterion[criterionList.size()]);
    }

    /**
     * ?? 
     * @author:lizhong
     * @param <T>
     * @param firstIndex  
     * @param maxResult ?? 'maxResult''firstIndex''-1',?.
     * @param wheresql where??,???where,???param1
     * :" o.username= :param1 and o.email= param2....."
     * @param params where????.
     * @param orderBy ?sql?orderby ?,map?key??,????(desc or asc)
     * @return
     */
    @SuppressWarnings("unchecked")
    public QueryResult<T> getScrollData(int firstIndex, int maxResult, String wheresql, Object[] params,
            LinkedHashMap<String, String> orderBy) {
        String where = wheresql == null || "".equals(wheresql.trim()) ? "" : " where " + wheresql;
        String entityName = entityClass.getName();
        String hql = "select o from " + entityName + " o " + where + buildOrderby(orderBy);
        Query query = getSession().createQuery(hql);
        setQueryParam(query, params);
        if (firstIndex != -1 && maxResult != -1) {
            query.setFirstResult(firstIndex).setMaxResults(maxResult);
        }
        QueryResult<T> qr = new QueryResult<T>();
        qr.setResultList(query.list());
        query = getSession()
                .createQuery("select count(" + getCountField(entityClass) + ") from " + entityName + " o " + where);
        setQueryParam(query, params);
        qr.setTotalRecord((Long) query.uniqueResult());
        return qr;
    }

    /**
     * ??,?,??.
     * @author:lizhong
     * @param firstIndex
     * @param maxResult ??
     * @param orderBy ?sql?orderby ?,map?key??,????(desc or asc)
     * @return
     */
    public QueryResult<T> getScrollData(int firstIndex, int maxResult, LinkedHashMap<String, String> orderBy) {
        return getScrollData(firstIndex, maxResult, null, null, orderBy);
    }

    /**
     * ??,?,??
     * @author:lizhong
     * @param <T>
     * @param firstIndex 
     * @param maxResult ??
     * @param wheresql where??,???where,???param1
     * :" o.username= :param1 and o.email= param2....."
     * @param params where????.
     * @return
     */
    public QueryResult<T> getScrollData(int firstIndex, int maxResult, String wheresql, Object[] params) {
        return getScrollData(firstIndex, maxResult, wheresql, params, null);

    }

    /**
     * ??.
     * @author:lizhong
     * @param <T>
     * @param firstIndex 
     * @param maxResult ??
     * @return
     */
    public QueryResult<T> getScrollData(int firstIndex, int maxResult) {
        return getScrollData(firstIndex, maxResult, null, null, null);
    }

    /**
     * ??
     * @author:lizhong
     *
     */
    public QueryResult<T> getScrollData() {
        return getScrollData(-1, -1);
    }

    /**
      * ?? ??
      * @author            : lizhong
       * @param wheresql    : where??,???where,???param1,:" o.username= :param1 and o.email= param2....."
       * @param params      : where????.
       * @param orderBy     : ?sql?orderby ?,map?key??,????(desc or asc)
      * @return
     */
    public QueryResult<T> getScrollData(String wheresql, Object[] params, LinkedHashMap<String, String> orderBy) {
        return getScrollData(-1, -1, wheresql, params, orderBy);
    }

    /**
     * order by? :order by o.email desc , o.username asc
     * @author: lizhong
     * @param orderBy key , valuedesc/asc.:
     * orderBy.put("email", "desc");
     * orderBy.put("username", "asc");
     * ?sql?order by o.email desc,o.username asc
     * @return
     */

    public static String buildOrderby(LinkedHashMap<String, String> orderBy) {
        StringBuilder order = new StringBuilder();
        if (orderBy != null && orderBy.size() > 0) {
            order.append(" order by ");
            for (Entry<String, String> entry : orderBy.entrySet()) {
                order.append(" o.").append(entry.getKey()).append(" ").append(entry.getValue()).append(",");
            }
            order.deleteCharAt(order.length() - 1);
        }
        return order.toString();
    }

    /**
     * where???,??1.:where o.username=?1 and o.email=?2 
     * @author: lizhong
     * @param query 
     * @param params ?
     */
    public static void setQueryParam(Query query, Object[] params) {
        String param = "";
        if (params != null) {
            for (int i = 0; i < params.length; i++) {
                param = "param" + (i + 1);
                query.setParameter(param, params[i]);
            }
        }
    }

    /**
     * ?,hibernate???select count(o) from Xxx o?BUG,
     * hibernatejpql??sqlselect count(field1,field2,...),count()
     * ??HQL?:"select count(*) from Object"
     * @author: lizhong
     * @param <E>
     * @param clazz
     * @return
     */
    protected static <E> String getCountField(Class<E> clazz) {
        String out = "o";
        try {
            PropertyDescriptor[] propertys = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
            for (PropertyDescriptor property : propertys) {
                Method method = property.getReadMethod();
                if (method != null && method.isAnnotationPresent(EmbeddedId.class)) {
                    PropertyDescriptor[] props = Introspector.getBeanInfo(property.getPropertyType())
                            .getPropertyDescriptors();
                    out = "o." + property.getName() + "."
                            + (!props[1].getName().equals("class") ? props[1].getName() : props[0].getName());
                    break;
                }
            }
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }
        return out;
    }

    /**
     * (detached)
     */
    @SuppressWarnings("unchecked")
    public List<T> find(DetachedCriteria query) {
        return query.getExecutableCriteria(this.getSession()).list();
    }

    /**
     * (detached)
     */
    @SuppressWarnings("unchecked")
    public List<T> find(DetachedCriteria query, int firstIndex, int maxResult) {
        return query.getExecutableCriteria(this.getSession()).setFirstResult(firstIndex).setMaxResults(maxResult)
                .list();
    }

    public List<T> execList(String hql, List<Object> values) {
        Assert.hasText(hql, "queryString?");
        Query query = getSession().createQuery(hql);
        if (values != null) {
            int i = 0;
            for (Object obj : values)
                query.setParameter(i++, obj);
        }
        return query.list();
    }

    /*
     * add by wucong
     * sql
     */
    public Page<T> findPageBySql(final Page<T> page, final String sql, final Object... values) {
        Assert.notNull(page, "page?");
        /*
         * sqlorderBy ?,order by ????
         * 
         * sql??????
         */
        Query q = createSqlQuery(sql, values);
        if (page.isAutoCount()) {
            long totalCount = countSqlResult(sql, values);
            page.setTotalCount(totalCount);
        }

        setPageParameterToSqlQuery(q, page);

        List result = q.list();
        page.setResult(result);
        return page;
    }

    /*
     * sql?
     */
    public Query createCountSqlQuery(final String queryString, final Object... values) {
        Assert.hasText(queryString, "queryString?");
        Query query = getSession().createSQLQuery(queryString);
        if (values != null) {
            for (int i = 0; i < values.length; i++) {
                query.setParameter(i, values[i]);
            }
        }
        return query;
    }

    /*
     * sql?
     */
    public Query createSqlQuery(final String queryString, final Object... values) {
        Assert.hasText(queryString, "queryString?");
        Query query = getSession().createSQLQuery(queryString).addEntity(entityClass);
        if (values != null) {
            for (int i = 0; i < values.length; i++) {
                query.setParameter(i, values[i]);
            }
        }
        return query;
    }

    /*
     * sql
     */
    protected long countSqlResult(final String sql, final Object... values) {
        String countSql = prepareCountSql(sql);
        BigDecimal count = findUniqueBySql(countSql, values);
        return count.longValue();
    }

    /*
     * sql??
     */
    private String prepareCountSql(String orgSql) {
        String fromHql = orgSql;
        //select??order by???count,?.
        fromHql = "from " + StringUtils.substringAfter(fromHql, "from");
        //      fromHql = StringUtils.substringBefore(fromHql, "order by");

        String countHql = "select count(*) " + fromHql;
        return countHql;
    }

    /*
     * ???
     */
    public <X> X findUniqueBySql(final String sql, final Object... values) {
        return (X) createCountSqlQuery(sql, values).uniqueResult();
    }

    /*
     * ?
     */
    protected Query setPageParameterToSqlQuery(final Query q, final Page<T> page) {

        Assert.isTrue(page.getPageSize() > 0, "Page Size must larger than zero");

        //hibernatefirstResult??0
        q.setFirstResult(page.getFirst() - 1);
        q.setMaxResults(page.getPageSize());

        return q;
    }

    public static String camelToUnderline(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append('_');
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
    * ??
    * 
    * @param clazz ?po
    * @return String
    */
    @SuppressWarnings("unchecked")
    protected String getTableName(Class clazz) {
        Table annotation = (Table) clazz.getAnnotation(Table.class);
        if (annotation != null) {
            return annotation.name();
        }

        return null;
    }

    /**
    * ????
        
    *
        
    * @author: zhaozongzhan
        
    * @create: 201618 ?10:43:43
        
    *
        
    * @param showFieldNames entity
    * @param queryFilters ?
    * @return
    */
    public List<T> getAppointedFieldNamesByEntitys(List<String> showFieldNames, List<PropertyFilter> queryFilters) {
        Criterion[] criterions = buildCriterionByPropertyFilter(queryFilters);
        List entitys = findShowFields(showFieldNames, criterions);
        if (entitys != null && entitys.size() > 0) {
            List<T> entitylist = new ArrayList<T>();
            setArrayValuesToEntity(entitys, entitylist, showFieldNames);
            return entitylist;
        } else
            return null;
    }

    /**
    * 
        
    *????
        
    * @author: zhaozongzhan
        
    * @create: 2016114 ?5:57:01
        
    *
        
    * @param showFieldNames
    * @param queryFilters
    * @return
    */
    public T getAppointedFieldNamesByEntity(List<String> showFieldNames, List<PropertyFilter> queryFilters) {
        Criterion[] criterions = buildCriterionByPropertyFilter(queryFilters);
        if (showFieldNames == null || showFieldNames.size() <= 0) {

            return (T) findShowFieldsUniqueResult(showFieldNames, criterions);
        }
        Object o = findShowFieldsUniqueResult(showFieldNames, criterions);

        if (o != null) {
            T entity = null;
            try {
                entity = entityClass.newInstance();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                logger.error("Could not instantiate entityClass: " + entityClass.getName());
                logger.error(String.format("getAppointedFieldNamesByEntity :%s:%",
                        entityClass.getName(), e.getMessage()));
                e.printStackTrace();
                throw new HibernateException("Could not instantiate entityClass: " + entityClass.getName());

            }
            setObjectValuesToEntity(o, entity, showFieldNames);
            return entity;
        } else
            return null;
    }

    /**
     * ???? 
     *VO??
     *VO?? ????? 
                  ?idsetId ?set
                   SQL:SELSECT supplier_id ,SHIPPING_FEE  ,REMIT_SHIPPING_MONEY FROM t_Supplier_Store supplier_id? SupplierStore?supplier_id? Supplier
        
        
     * @author: zhaozongzhan
        
     * @create: 201618 ?6:05:45
        
     *
        
     * @param sql
     * @param vo 
     * VO?? ?????
     * vo??VO ????
     * @param queryParameterValues
     * @return
     */
    public List<T> findBySQL(String sql, Class vo, final Object... queryParameterValues) {

        Query query = createCountSqlQuery(sql, queryParameterValues);
        if (vo == null)
            query.setResultTransformer(new SQLColumnToBean(entityClass));//supplier_idVO??supplierId
        else//vo??VO ????
            query.setResultTransformer(new SQLColumnToBean(vo));//supplier_idVO??supplierId
        List entitys = query.list();
        return entitys;

    }

    /**
     * 
        
     *
        
     * @author: zhaozongzhan
        
     * @create: 2016112 ?5:27:29
        
     *
        
     * @param values ?
     * @param entitylist ?
     * @param showFieldNames  ?
     */

    private void setArrayValuesToEntity(List values, List<T> entitylist, List<String> showFieldNames) {

        if (values != null && values.size() > 0) {

            if (showFieldNames != null && showFieldNames.size() > 0) {
                int showFieldNamesSize = showFieldNames.size();
                List<T> myentitys = new ArrayList();
                for (int i = 0; i < values.size(); i++) {
                    T entity = null;
                    try {
                        entity = entityClass.newInstance();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        logger.error("Could not instantiate entityClass: " + entityClass.getName());
                        logger.error(String.format("getAppointedFieldNamesByEntity :%s:%",
                                entityClass.getName(), e.getMessage()));
                        e.printStackTrace();
                        throw new HibernateException("Could not instantiate entityClass: " + entityClass.getName());

                    }
                    //??HIBERNATE?????
                    if (showFieldNamesSize > 1) {
                        Object[] fieldValueArry = (Object[]) values.get(i);

                        int fieldSize = fieldValueArry.length;

                        for (int f = 0; f < fieldSize; f++) {
                            ClassUtils.setFieldValue(entity, showFieldNames.get(f), fieldValueArry[f]);
                        }

                    } else {
                        Object fieldValueObj = values.get(i);
                        ClassUtils.setFieldValue(entity, showFieldNames.get(0), fieldValueObj);
                    }
                    entitylist.add(entity);
                }

            } else {
                entitylist.addAll(values);
            }

        }

    }

    /**
     * HIBERNATE??
        
     *
        
     * @author: zhaozongzhan
        
     * @create: 2016115 ?10:15:45
        
     *
        
     * @param value HIBERNATE
     * @param entity ?
     * @param showFieldNames ?
     */
    private void setObjectValuesToEntity(Object value, T entity, List<String> showFieldNames) {

        if (value != null && value.equals(entity)) {

            return;
        }

        if (showFieldNames != null && showFieldNames.size() > 0) {

            //??HIBERNATE?????
            if (showFieldNames != null && showFieldNames.size() > 1) {
                Object[] fieldValueArry = (Object[]) value;
                int fieldSize = fieldValueArry.length;

                for (int f = 0; f < fieldSize; f++) {
                    ClassUtils.setFieldValue(entity, showFieldNames.get(f), fieldValueArry[f]);
                }

            } else {

                ClassUtils.setFieldValue(entity, showFieldNames.get(0), value);
            }

        }

    }

    /**
     * 
        
     *Criteria?.
        
     * @author: zhaozongzhan
        
     * @create: 2016113 ?10:46:36
        
     *
        
     * @param page ?
     * @param showFieldNames ?
     * @param criterions ???Criterion.
     * @return  .??.
     */
    public Page<T> pageAppointedFieldNamesByEntity(final Page<T> page, final List<PropertyFilter> filters,
            List<String> showFieldNames) {
        Assert.notNull(page, "page?");
        Criterion[] criterions = buildCriterionByPropertyFilter(filters);
        Criteria c = setShowFields(showFieldNames, criterions);

        if (page.isAutoCount()) {
            long totalCount = countCriteriaResult(c);
            page.setTotalCount(totalCount);
        }

        setPageParameterToCriteria(c, page);

        List result = c.list();
        if (result != null && result.size() > 0) {
            List<T> entitylist = new ArrayList<T>();
            setArrayValuesToEntity(result, entitylist, showFieldNames);
            page.setResult(entitylist);
        }

        return page;
    }

    /**
     * ??
     * @param lsit
     * @return
     * @throws SQLException 
     */
    @Transactional
    public void saveOrupdatBatch(List<Object> list) {

        int batchSize = 100;
        if (list == null || list.isEmpty())
            return;
        Session session = null;
        Transaction tx = null;
        try {
            session = getSessionFactory().openSession();
            tx = session.getTransaction();
            tx.begin();
            for (int i = 0; i < list.size(); i++) {
                session.merge((list.get(i)));
                if (i % batchSize == 0) {
                    session.flush();
                    session.clear();
                }
            }
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            if (null != tx) {
                tx = null;
            }
            if (null != session) {
                session = null;
            }
        }
    }

}