- package org.lzpeng.dao;
-
- import java.io.Serializable;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.Query;
- import org.hibernate.criterion.Criterion;
- import org.springside.modules.orm.hibernate.Page;
-
-
- /**
- *
- * @version 2009-1-10
- * @author lzpeng
- *
- */
- public interface IGenericDAO<T, PK extends Serializable> {
-
- public void save(T entity);
-
- public void delete(T entity);
-
- public void delete(PK id);
-
- public List<T> findAll();
-
- public Page<T> findAll(Page<T> page);
-
- /**
- * 按id獲取對象.
- */
- public T get(final PK id);
-
- /**
- * 按HQL查詢對象列表.
- *
- * @param hql
- * hql語句
- * @param values
- * 數(shù)量可變的參數(shù)
- */
- public List find(String hql, Object... values);
-
- /**
- * 按HQL分頁查詢. 暫不支持自動獲取總結(jié)果數(shù),需用戶另行執(zhí)行查詢.
- *
- * @param page
- * 分頁參數(shù).包括pageSize 和firstResult.
- * @param hql
- * hql語句.
- * @param values
- * 數(shù)量可變的參數(shù).
- *
- * @return 分頁查詢結(jié)果,附帶結(jié)果列表及所有查詢時的參數(shù).
- */
- public Page<T> find(Page<T> page, String hql, Object... values);
-
- /**
- * 按HQL查詢唯一對象.
- */
- public Object findUnique(String hql, Object... values);
-
- /**
- * 按HQL查詢Intger類形結(jié)果.
- */
- public Integer findInt(String hql, Object... values);
-
- /**
- * 按HQL查詢Long類型結(jié)果.
- */
- public Long findLong(String hql, Object... values);
-
- /**
- * 按Criterion查詢對象列表.
- *
- * @param criterion
- * 數(shù)量可變的Criterion.
- */
- public List<T> findByCriteria(Criterion... criterion);
-
- /**
- * 按Criterion分頁查詢.
- *
- * @param page
- * 分頁參數(shù).包括pageSize、firstResult、orderBy、asc、autoCount.
- * 其中firstResult可直接指定,也可以指定pageNo. autoCount指定是否動態(tài)獲取總結(jié)果數(shù).
- *
- * @param criterion
- * 數(shù)量可變的Criterion.
- * @return 分頁查詢結(jié)果.附帶結(jié)果列表及所有查詢時的參數(shù).
- */
- public Page<T> findByCriteria(Page page, Criterion... criterion);
-
- /**
- * 按屬性查找對象列表.
- */
- public List<T> findByProperty(String propertyName, Object value);
-
- /**
- * 按屬性查找唯一對象.
- */
- public T findUniqueByProperty(String propertyName, Object value);
-
- /**
- * 根據(jù)查詢函數(shù)與參數(shù)列表創(chuàng)建Query對象,后續(xù)可進(jìn)行更多處理,輔助函數(shù).
- */
- public Query createQuery(String queryString, Object... values);
-
- /**
- * 根據(jù)Criterion條件創(chuàng)建Criteria,后續(xù)可進(jìn)行更多處理,輔助函數(shù).
- */
- public Criteria createCriteria(Criterion... criterions);
-
- /**
- * 判斷對象的屬性值在數(shù)據(jù)庫內(nèi)是否唯一.
- *
- */
- public boolean isPropertyUnique(String propertyName, Object newValue,
- Object orgValue);
-
- /**
- * 通過count查詢獲得本次查詢所能獲得的對象總數(shù).
- *
- * @return page對象中的totalCount屬性將賦值.
- */
- public int countQueryResult(Page<T> page, Criteria c);
- }
- package org.lzpeng.dao.impl;
-
- import java.io.Serializable;
- import java.lang.reflect.ParameterizedType;
- import java.util.ArrayList;
- import java.util.List;
-
- import org.hibernate.Criteria;
- 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.Order;
- import org.hibernate.criterion.Projection;
- import org.hibernate.criterion.Projections;
- import org.hibernate.criterion.Restrictions;
- import org.hibernate.impl.CriteriaImpl;
- import org.hibernate.transform.ResultTransformer;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.springframework.util.Assert;
- import org.lzpeng.dao.IGenericDAO;
- import org.springside.modules.utils.BeanUtils;
- import org.springside.modules.orm.hibernate.Page;
- import org.springside.modules.orm.hibernate.QueryParameter;
-
- /**
- * Hibernate的范型基類.
- * <p>
- * 可以在service類中直接創(chuàng)建使用.也可以繼承出DAO子類
- * </p>
- * 修改自Springside SimpleHibernateTemplate
- *
- * @param <T>
- * DAO操作的對象類型
- * @param <PK>
- * 主鍵類型
- *
- *
- */
- @SuppressWarnings("unchecked")
- public class GenericDAOImpl<T, PK extends Serializable> extends
- HibernateDaoSupport implements IGenericDAO<T, PK> {
-
- protected Logger logger = LoggerFactory.getLogger(getClass());
-
- protected SessionFactory sessionFactory;
-
- protected Session session;
-
- protected Class<?> entityClass;
-
- public GenericDAOImpl() {
- this.entityClass = (Class<?>) ((ParameterizedType) getClass()
- .getGenericSuperclass()).getActualTypeArguments()[0];
- }
-
- public GenericDAOImpl(SessionFactory sessionFactory, Class<T> entityClass) {
- super.setSessionFactory(sessionFactory);
- this.entityClass = entityClass;
- }
-
- public void save(T entity) {
- Assert.notNull(entity);
- super.getHibernateTemplate().saveOrUpdate(entity);
- logger.info("save entity: {}", entity);
- }
-
- public void delete(T entity) {
- Assert.notNull(entity);
- super.getHibernateTemplate().delete(entity);
- logger.info("delete entity: {}", entity);
- }
-
- public void delete(PK id) {
- Assert.notNull(id);
- delete(get(id));
- }
-
- public List<T> findAll() {
- return findByCriteria();
- }
-
- public Page<T> findAll(Page<T> page) {
- return findByCriteria(page);
- }
-
- public T get(final PK id) {
- if(super.getHibernateTemplate() == null){
- System.out.println("asdfasdf");
- }
- return (T) super.getHibernateTemplate().get(entityClass, id);
- }
-
- public List find(String hql, Object... values) {
- return createQuery(hql, values).list();
- }
-
- public Page<T> find(Page<T> page, String hql, Object... values) {
- Assert.notNull(page);
-
- if (page.isAutoCount()) {
- logger.warn("HQL查詢暫不支持自動獲取總結(jié)果數(shù),hql為{}", hql);
- }
- Query q = createQuery(hql, values);
- if (page.isFirstSetted()) {
- q.setFirstResult(page.getFirst());
- }
- if (page.isPageSizeSetted()) {
- q.setMaxResults(page.getPageSize());
- }
- page.setResult(q.list());
- return page;
- }
-
- /**
- * 按HQL查詢唯一對象.
- */
- public Object findUnique(String hql, Object... values) {
- return createQuery(hql, values).uniqueResult();
- }
-
- public Integer findInt(String hql, Object... values) {
- return (Integer) findUnique(hql, values);
- }
-
- public Long findLong(String hql, Object... values) {
- return (Long) findUnique(hql, values);
- }
-
- public List<T> findByCriteria(Criterion... criterion) {
- return createCriteria(criterion).list();
- }
-
- public Page<T> findByCriteria(Page page, Criterion... criterion) {
- Assert.notNull(page);
-
- Criteria c = createCriteria(criterion);
-
- if (page.isAutoCount()) {
- page.setTotalCount(countQueryResult(page, c));
- }
- if (page.isFirstSetted()) {
- c.setFirstResult(page.getFirst());
- }
- if (page.isPageSizeSetted()) {
- c.setMaxResults(page.getPageSize());
- }
-
- if (page.isOrderBySetted()) {
- if (page.getOrder().endsWith(QueryParameter.ASC)) {
- c.addOrder(Order.asc(page.getOrderBy()));
- } else {
- c.addOrder(Order.desc(page.getOrderBy()));
- }
- }
- page.setResult(c.list());
- return page;
- }
-
- /**
- * 按屬性查找對象列表.
- */
- public List<T> findByProperty(String propertyName, Object value) {
- Assert.hasText(propertyName);
- return createCriteria(Restrictions.eq(propertyName, value)).list();
- }
-
- public T findUniqueByProperty(String propertyName, Object value) {
- Assert.hasText(propertyName);
- return (T) createCriteria(Restrictions.eq(propertyName, value))
- .uniqueResult();
- }
-
- public Query createQuery(String queryString, Object... values) {
- Assert.hasText(queryString);
- super.getSession().createQuery(queryString);
- Query queryObject = super.getSession().createQuery(queryString);
- if (values != null) {
- for (int i = 0; i < values.length; i++) {
- queryObject.setParameter(i, values[i]);
- }
- }
- return queryObject;
- }
-
-
- public Criteria createCriteria(Criterion... criterions) {
- Criteria criteria = super.getSession().createCriteria(entityClass);
- for (Criterion c : criterions) {
- criteria.add(c);
- }
- return criteria;
- }
-
-
- public boolean isPropertyUnique(String propertyName, Object newValue,
- Object orgValue) {
- if (newValue == null || newValue.equals(orgValue))
- return true;
-
- Object object = findUniqueByProperty(propertyName, newValue);
- return (object == null);
- }
-
- public int countQueryResult(Page<T> page, Criteria c) {
- CriteriaImpl impl = (CriteriaImpl) c;
-
- // 先把Projection、ResultTransformer、OrderBy取出來,清空三者后再執(zhí)行Count操作
- Projection projection = impl.getProjection();
- ResultTransformer transformer = impl.getResultTransformer();
-
- List<CriteriaImpl.OrderEntry> orderEntries = null;
- try {
- orderEntries = (List) BeanUtils.getFieldValue(impl, "orderEntries");
- BeanUtils.setFieldValue(impl, "orderEntries", new ArrayList());
- } catch (Exception e) {
- logger.error("不可能拋出的異常:{}", e.getMessage());
- }
-
- // 執(zhí)行Count查詢
- int totalCount = (Integer) c.setProjection(Projections.rowCount())
- .uniqueResult();
- if (totalCount < 1)
- return -1;
-
- // 將之前的Projection和OrderBy條件重新設(shè)回去
- c.setProjection(projection);
-
- if (projection == null) {
- c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
- }
- if (transformer != null) {
- c.setResultTransformer(transformer);
- }
-
- try {
- BeanUtils.setFieldValue(impl, "orderEntries", orderEntries);
- } catch (Exception e) {
- logger.error("不可能拋出的異常:{}", e.getMessage());
- }
-
- return totalCount;
- }
-
- }
- 1.service中直接使用
- GenericDAOImpl<User, Integer> userDAO = new GenericDAOImpl<User, Integer>(sessionFactory, User.class);
-
- 2.繼承出子DAO
- interface IUserDAO extends IGenericDAO<User, Integer>
-
- class UserDAOImpl extends GenericDAOImpl<User, Integer> implements IUserDAO
|