Java tutorial
/******************************************************************************* * 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(); } /************************************************************************/ }