org.pssframework.dao.BaseHibernateDao.java Source code

Java tutorial

Introduction

Here is the source code for org.pssframework.dao.BaseHibernateDao.java

Source

/*******************************************************************************
 * Copyright (c) 2010 PSS Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     PSS Corporation - initial API and implementation
 *******************************************************************************/
package org.pssframework.dao;

import static cn.org.rapid_framework.util.SqlRemoveUtils.removeFetchKeyword;
import static cn.org.rapid_framework.util.SqlRemoveUtils.removeOrders;
import static cn.org.rapid_framework.util.SqlRemoveUtils.removeSelect;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.dialect.Dialect;
import org.hibernate.impl.SessionFactoryImpl;
import org.hibernate.metadata.ClassMetadata;
import org.pssframework.base.EntityDao;
import org.pssframework.xsqlbuilder.SafeSqlProcesser;
import org.pssframework.xsqlbuilder.SafeSqlProcesserFactory;
import org.pssframework.xsqlbuilder.XsqlBuilder;
import org.pssframework.xsqlbuilder.XsqlBuilder.XsqlFilterResult;
import org.pssframework.xsqlbuilder.safesql.DirectReturnSafeSqlProcesser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;

import cn.org.rapid_framework.page.Page;
import cn.org.rapid_framework.page.PageRequest;

/**
 * 
 * @author Baocj
 *
 * @param <E>
 * @param <PK>
 */
public abstract class BaseHibernateDao<E, PK extends Serializable> extends HibernateDaoSupport
        implements EntityDao<E, PK> {
    /**
     * Logger for subclass
     */
    protected final Logger log = LoggerFactory.getLogger(getClass());

    protected XsqlFilterResult queryXsqlResult(final String query, final Map<String, ?> filters) {
        XsqlBuilder builder = getXsqlBuilder();
        //?otherFilterspageRequest.getFilters()filters
        XsqlFilterResult queryXsqlResult = builder.generateHql(query, filters);
        return queryXsqlResult;
    }

    @SuppressWarnings("unchecked")
    private List queryAll(final String query, final Map<String, ?> filters, final boolean hql) {
        return (List) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                XsqlFilterResult queryXsqlResult = queryXsqlResult(query, filters);

                Query query = setQueryParameters(
                        (hql ? session.createQuery(queryXsqlResult.getXsql())
                                : session.createSQLQuery(queryXsqlResult.getXsql())),
                        queryXsqlResult.getAcceptedFilters());

                return query.list();
            }
        });
    }

    @SuppressWarnings("unchecked")
    private Page pageQuery(final PageRequest pageRequest, final XsqlFilterResult queryXsqlResult,
            final XsqlFilterResult countQueryXsqlResult) {
        return (Page) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {

                Query query = setQueryParameters(session.createQuery(queryXsqlResult.getXsql()),
                        queryXsqlResult.getAcceptedFilters());
                Query countQuery = setQueryParameters(
                        session.createQuery(removeOrders(countQueryXsqlResult.getXsql())),
                        countQueryXsqlResult.getAcceptedFilters());

                return executeQueryForPage(pageRequest, query, countQuery);
            }
        });
    }

    @SuppressWarnings("unchecked")
    private Object executeQueryForPage(final PageRequest pageRequest, Query query, Query countQuery) {
        Page page = new Page(pageRequest, ((Number) countQuery.uniqueResult()).intValue());
        if (page.getTotalCount() == 0) {
            page.setResult(new ArrayList(0));
        } else {
            page.setResult(query.setFirstResult(page.getFirstResult()).setMaxResults(page.getPageSize()).list());
        }
        return page;
    }

    public static Query setQueryParameters(Query q, Map params) {
        for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry) it.next();
            q.setParameter((String) entry.getKey(), entry.getValue());
        }
        return q;
    }

    public void batchDelete(Collection<E> entities) {
        getHibernateTemplate().deleteAll(entities);
    }

    public void batchUpdate(Collection<E> entities) {
        for (E e : entities) {
            saveOrUpdate(e);
        }

    }

    public void batchInsert(Collection<E> entities) {
        for (E e : entities) {
            save(e);
        }
    }

    /******************************************************************************/
    public long queryForLong(final String queryString) {
        return queryForLong(queryString, new Object[] {});
    }

    public long queryForLong(final String queryString, Object value) {
        return queryForLong(queryString, new Object[] { value });
    }

    public long queryForLong(final String queryString, Object[] values) {
        return DataAccessUtils.longResult(getHibernateTemplate().find(queryString, values));
    }

    /**
     * ?,
     * @param pageRequest
     * @return
     */
    public Page findAll(final PageRequest pageRequest) {
        return (Page) getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {

                StringBuffer queryString = new StringBuffer(" FROM ").append(getEntityClass().getSimpleName());
                String countQueryString = "SELECT count(*) " + queryString.toString();
                if (StringUtils.hasText(pageRequest.getSortColumns())) {
                    queryString.append(" ORDER BY " + pageRequest.getSortColumns());
                }

                Query query = session.createQuery(queryString.toString());
                Query countQuery = session.createQuery(countQueryString);
                return PageQueryUtils.executeQueryForPage(pageRequest, query, countQuery);
            }
        });
    }

    public Page pageQuery(final String sql, final PageRequest pageRequest) {
        final String countQuery = "select count(*) " + removeSelect(removeFetchKeyword((sql)));
        return pageQuery(sql, countQuery, pageRequest);
    }

    public Page pageQuery(final String sql, String countQuery, final PageRequest pageRequest) {
        Map otherFilters = new HashMap(1);
        otherFilters.put("sortColumns", pageRequest.getSortColumns());

        XsqlBuilder builder = getXsqlBuilder();

        //?otherFilterspageRequestfilters
        XsqlFilterResult queryXsqlResult = builder.generateHql(sql, otherFilters, pageRequest);
        XsqlFilterResult countQueryXsqlResult = builder.generateHql(countQuery, otherFilters, pageRequest);

        return PageQueryUtils.pageQuery(getHibernateTemplate(), pageRequest, queryXsqlResult, countQueryXsqlResult);
    }

    protected XsqlBuilder getXsqlBuilder() {
        SessionFactoryImpl sf = (SessionFactoryImpl) (getSessionFactory());
        Dialect dialect = sf.getDialect();

        //or SafeSqlProcesserFactory.getMysql();
        SafeSqlProcesser safeSqlProcesser = SafeSqlProcesserFactory.getFromCacheByHibernateDialect(dialect);
        XsqlBuilder builder = new XsqlBuilder(safeSqlProcesser);

        if (builder.getSafeSqlProcesser().getClass() == DirectReturnSafeSqlProcesser.class) {
            System.err.println(BaseHibernateDao.class.getSimpleName()
                    + ".getXsqlBuilder(): ?,?Sql,??sql?,?Sql??new XsqlBuilder(SafeSqlProcesserFactory.getDataBaseName())?");
        }
        return builder;
    }

    static class PageQueryUtils {
        private static Page pageQuery(HibernateTemplate template, final PageRequest pageRequest,
                final XsqlFilterResult queryXsqlResult, final XsqlFilterResult countQueryXsqlResult) {
            return (Page) template.execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {

                    Query query = setQueryParameters(session.createQuery(queryXsqlResult.getXsql()), pageRequest);
                    Query countQuery = setQueryParameters(
                            session.createQuery(removeOrders(countQueryXsqlResult.getXsql())), pageRequest);

                    return executeQueryForPage(pageRequest, query, countQuery);
                }
            });
        }

        private static Object executeQueryForPage(final PageRequest pageRequest, Query query, Query countQuery) {
            Page page = new Page(pageRequest, ((Number) countQuery.uniqueResult()).intValue());
            if (page.getTotalCount() <= 0) {
                page.setResult(new ArrayList(0));
            } else {
                page.setResult(
                        query.setFirstResult(page.getFirstResult()).setMaxResults(page.getPageSize()).list());
            }
            return page;
        }

        public static Query setQueryParameters(Query q, Object params) {
            q.setProperties(params);
            return q;
        }

        public static Query setQueryParameters(Query q, Map params) {
            q.setProperties(params);
            return q;
        }
    }

    public void save(E entity) {
        getHibernateTemplate().save(entity);
    }

    public List<E> findAll() {
        return getHibernateTemplate().loadAll(getEntityClass());
    }

    public E getById(PK id) {
        return (E) getHibernateTemplate().get(getEntityClass(), id);
    }

    public void delete(Object entity) {
        getHibernateTemplate().delete(entity);
    }

    public void delete(Serializable entity) {
        getHibernateTemplate().delete(entity);
    }

    public void deleteById(PK id) {
        Object entity = getById(id);
        if (entity == null) {
            throw new ObjectRetrievalFailureException(getEntityClass(), id);
        }
        getHibernateTemplate().delete(entity);
    }

    public void update(E entity) {
        getHibernateTemplate().update(entity);
    }

    public void saveOrUpdate(E entity) {
        getHibernateTemplate().saveOrUpdate(entity);
    }

    public void refresh(Object entity) {
        getHibernateTemplate().refresh(entity);
    }

    public void flush() {
        getHibernateTemplate().flush();
    }

    public void evict(Object entity) {
        getHibernateTemplate().evict(entity);
    }

    public void saveAll(Collection<E> entities) {
        for (Iterator<E> it = entities.iterator(); it.hasNext();) {
            save(it.next());
        }
    }

    public void deleteAll(Collection entities) {
        getHibernateTemplate().deleteAll(entities);
    }

    public E findByProperty(final String propertyName, final Object value) {

        return (E) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                return session.createCriteria(getEntityClass()).add(Restrictions.eq(propertyName, value))
                        .uniqueResult();
            }
        });
    }

    public List<E> findAllByProperty(final String propertyName, final Object value) {
        return getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                return session.createCriteria(getEntityClass()).add(Restrictions.eq(propertyName, value)).list();
            }
        });
    }

    /**
     * ???.
     *
     * @param uniquePropertyNames POJO???,? "name,loginid,password"
     */
    public boolean isUnique(E entity, String uniquePropertyNames) {
        Assert.hasText(uniquePropertyNames);
        Criteria criteria = getSession().createCriteria(getEntityClass()).setProjection(Projections.rowCount());
        String[] nameList = uniquePropertyNames.split(",");
        try {
            // 
            for (int i = 0; i < nameList.length; i++) {
                criteria.add(Restrictions.eq(nameList[i], PropertyUtils.getProperty(entity, nameList[i])));
            }

            // ?update,entity.

            String idName = getSessionFactory().getClassMetadata(entity.getClass()).getIdentifierPropertyName();
            if (idName != null) {
                // ?entity
                Serializable id = (Serializable) PropertyUtils.getProperty(entity, idName);

                // id!=null,,?update,
                if (id != null)
                    criteria.add(Restrictions.not(Restrictions.eq(idName, id)));
            }
        } catch (Exception e) {
            ReflectionUtils.handleReflectionException(e);
        }
        return ((Number) criteria.uniqueResult()).intValue() == 0;
    }

    public abstract Class getEntityClass();

    /*************************************************************************/

    /**
     *   ?.
     */
    public List<E> getAll() {
        return find();
    }

    /**
     * ,??.
     */
    public List<E> findBy(final String propertyName, final Object value) {
        Assert.hasText(propertyName, "propertyName?");
        Criterion criterion = Restrictions.eq(propertyName, value);
        return find(criterion);
    }

    /**
     * ,??.
     */
    public E findUniqueBy(final String propertyName, final Object value) {
        Assert.hasText(propertyName, "propertyName?");
        Criterion criterion = Restrictions.eq(propertyName, value);
        return (E) createCriteria(criterion).uniqueResult();
    }

    /**
     * id?.
     */
    public List<E> findByIds(List<PK> ids) {
        return find(Restrictions.in(getIdName(), ids));
    }

    /**
     * HQL.
     * 
     * @param values ????,?.
     */
    public <X> List<X> findAll(final String hql, final Object... values) {
        return createQuery(hql, values).list();
    }

    /**
     * HQL.
     * 
     * @param values ???,??.
     */
    public <X> List<X> findAll(final String hql, final Map<String, ?> values) {
        return findAllByHql(hql, values);
    }

    /**
     * HQL.
     * 
     * @param values ???,??.
     */
    public <X> List<X> findAllByHql(final String hql, final Map<String, ?> values) {
        return queryAll(hql, values, true);
    }

    /**
     * HQL.
     * 
     * @param values ???,??.
     */
    public <X> List<X> findAllBySql(final String hql, final Map<String, ?> values) {
        return queryAll(hql, values, false);
    }

    /**
     * HQL.
     * 
     * @param values ????,?.
     */
    public <X> X findUnique(final String hql, final Object... values) {
        return (X) createQuery(hql, values).uniqueResult();
    }

    /**
     * HQL.
     * 
     * @param values ???,??.
     */
    public <X> X findUnique(final String hql, final Map<String, ?> values) {
        return (X) createQuery(hql, values).uniqueResult();
    }

    /**
     * HQL?/?.
     */
    public int batchExecute(final String hql, final Object... values) {
        return createQuery(hql, values).executeUpdate();
    }

    /**
     * HQL?/?.
     * @return .
     */
    public int batchExecute(final String hql, final Map<String, ?> values) {
        return createQuery(hql, values).executeUpdate();
    }

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

    /**
     * ?HQL?Query.
     * 
     * @param values ???,??.
     */
    public Query createQuery(final String queryString, final Map<String, ?> values) {
        Assert.hasText(queryString, "queryString?");
        Query query = getSession().createQuery(queryString);
        if (values != null) {
            query.setProperties(values);
        }
        return query;
    }

    /**
     * Criteria.
     * 
     * @param criterions ???Criterion.
     */
    public List<E> find(final Criterion... criterions) {
        return createCriteria(criterions).list();
    }

    /**
     * Criteria.
     * 
     * @param criterions ???Criterion.
     */
    public E findUnique(final Criterion... criterions) {
        return (E) createCriteria(criterions).uniqueResult();
    }

    /**
     * ?Criterion?Criteria.
     * 
     * ?find()T,?T.
     * 
     * @param criterions ???Criterion.
     */
    public Criteria createCriteria(final Criterion... criterions) {
        Criteria criteria = getSession().createCriteria(getEntityClass());
        for (Criterion c : criterions) {
            criteria.add(c);
        }
        return criteria;
    }

    /**
     * ?.
     * load()Proxy, View???.
     * ??entity,????.
     * ??,?,:
     * Hibernate.initialize(user.getRoles())?User??.
     * Hibernate.initialize(user.getDescription())?UserDescription.
     */
    public void initEntity(E entity) {
        Hibernate.initialize(entity);
    }

    /**
     * @see #initEntity(Object)
     */
    public void initEntity(List<E> entityList) {
        for (E entity : entityList) {
            Hibernate.initialize(entity);
        }
    }

    /**
     * Querydistinct transformer.
     */
    public Query distinct(Query query) {
        query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
        return query;
    }

    /**
     * Criteriadistinct transformer.
     */
    public Criteria distinct(Criteria criteria) {
        criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
        return criteria;
    }

    /**
     * ???.
     */
    public String getIdName() {
        ClassMetadata meta = getSessionFactory().getClassMetadata(getEntityClass());
        return meta.getIdentifierPropertyName();
    }

    /**
     *   ?,??.
     */
    public List<E> getAll(String orderBy, boolean isAsc) {
        Criteria c = createCriteria();
        if (isAsc) {
            c.addOrder(Order.asc(orderBy));
        } else {
            c.addOrder(Order.desc(orderBy));
        }
        return c.list();
    }

    /************************************************************************/

}