- 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
- * 数量可变的参数
- */
- public List find(String hql, Object... values);
- /**
- * 按HQL分页查询. 暂不支持自动获取总结果数,需用户另行执行查询.
- *
- * @param page
- * 分页参数.包括pageSize 和firstResult.
- * @param hql
- * hql语句.
- * @param values
- * 数量可变的参数.
- *
- * @return 分页查询结果,附带结果列表及所有查询时的参数.
- */
- public Page<T> find(Page<T> page, String hql, Object... values);
- /**
- * 按HQL查询唯一对象.
- */
- public Object findUnique(String hql, Object... values);
- /**
- * 按HQL查询Intger类形结果.
- */
- public Integer findInt(String hql, Object... values);
- /**
- * 按HQL查询Long类型结果.
- */
- public Long findLong(String hql, Object... values);
- /**
- * 按Criterion查询对象列表.
- *
- * @param criterion
- * 数量可变的Criterion.
- */
- public List<T> findByCriteria(Criterion... criterion);
- /**
- * 按Criterion分页查询.
- *
- * @param page
- * 分页参数.包括pageSize、firstResult、orderBy、asc、autoCount.
- * 其中firstResult可直接指定,也可以指定pageNo. autoCount指定是否动态获取总结果数.
- *
- * @param criterion
- * 数量可变的Criterion.
- * @return 分页查询结果.附带结果列表及所有查询时的参数.
- */
- public Page<T> findByCriteria(Page page, Criterion... criterion);
- /**
- * 按属性查找对象列表.
- */
- public List<T> findByProperty(String propertyName, Object value);
- /**
- * 按属性查找唯一对象.
- */
- public T findUniqueByProperty(String propertyName, Object value);
- /**
- * 根据查询函数与参数列表创建Query对象,后续可进行更多处理,辅助函数.
- */
- public Query createQuery(String queryString, Object... values);
- /**
- * 根据Criterion条件创建Criteria,后续可进行更多处理,辅助函数.
- */
- public Criteria createCriteria(Criterion... criterions);
- /**
- * 判断对象的属性值在数据库内是否唯一.
- *
- */
- public boolean isPropertyUnique(String propertyName, Object newValue,
- Object orgValue);
- /**
- * 通过count查询获得本次查询所能获得的对象总数.
- *
- * @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类中直接创建使用.也可以继承出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查询暂不支持自动获取总结果数,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取出来,清空三者后再执行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());
- }
- // 执行Count查询
- int totalCount = (Integer) c.setProjection(Projections.rowCount())
- .uniqueResult();
- if (totalCount < 1)
- return -1;
- // 将之前的Projection和OrderBy条件重新设回去
- 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