Java tutorial
/** * Copyright (c) 2005-2009 springside.org.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * * $Id: SimpleHibernateDao.java 582 2009-10-22 14:26:23Z calvinxiu $ */ package com.cmweb.orm.hibernate; import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.hibernate.Criteria; import org.hibernate.Hibernate; 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.Restrictions; import org.hibernate.metadata.ClassMetadata; import org.springframework.beans.factory.annotation.Autowired; import com.cmweb.utils.ReflectionUtils; @SuppressWarnings("unchecked") public class SimpleHibernateDao<T, PK extends Serializable> { protected SessionFactory sessionFactory; protected Class<T> entityClass; public SimpleHibernateDao() { this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass()); } public SimpleHibernateDao(final SessionFactory sessionFactory, final Class<T> entityClass) { this.sessionFactory = sessionFactory; this.entityClass = entityClass; } public SessionFactory getSessionFactory() { return sessionFactory; } @Autowired public void setSessionFactory(final SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession() { return sessionFactory.getCurrentSession(); } public void save(final T entity) throws Exception { getSession().saveOrUpdate(entity); } public void saveAll(final List<T> list) throws Exception { for (T entity : list) { this.save(entity); } } public void delete(final T entity) { getSession().delete(entity); } public void delete(final PK id) { delete(get(id)); } public T get(final PK id) { return (T) getSession().get(entityClass, id); } public List<T> getAll() { return find(); } public List<T> getAll(String orderBy, boolean isAsc) { Criteria c = createCriteria(); if (isAsc) { c.addOrder(Order.asc(orderBy)); } else { c.addOrder(Order.desc(orderBy)); } return c.list(); } public List<T> findBy(final String propertyName, final Object value) { Criterion criterion = Restrictions.eq(propertyName, value); return find(criterion); } public T findUniqueBy(final String propertyName, final Object value) { Criterion criterion = Restrictions.eq(propertyName, value); return (T) createCriteria(criterion).uniqueResult(); } public List<T> findByIds(List<PK> ids) { return find(Restrictions.in(getIdName(), ids)); } public <X> List<X> find(final String hql, final Object... values) { return createQuery(hql, values).list(); } public <X> List<X> find(final String hql, final Map<String, Object> values) { return createQuery(hql, values).list(); } public <X> X findUnique(final String hql, final Object... values) { return (X) createQuery(hql, values).uniqueResult(); } public <X> X findUnique(final String hql, final Map<String, Object> values) { return (X) createQuery(hql, values).uniqueResult(); } public int batchExecute(final String hql, final Object... values) { return createQuery(hql, values).executeUpdate(); } public int batchExecute(final String hql, final Map<String, Object> values) { return createQuery(hql, values).executeUpdate(); } public Query createQuery(final String queryString, final Object... values) { Query query = getSession().createQuery(queryString); if (values != null) { for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } } return query; } public Query createQuery(final String queryString, final Map<String, Object> values) { Query query = getSession().createQuery(queryString); if (values != null) { query.setProperties(values); } return query; } public List<T> find(final Criterion... criterions) { return createCriteria(criterions).list(); } public T findUnique(final Criterion... criterions) { return (T) createCriteria(criterions).uniqueResult(); } public Criteria createCriteria(final Criterion... criterions) { Criteria criteria = getSession().createCriteria(entityClass); for (Criterion c : criterions) { criteria.add(c); } return criteria; } public void initEntity(T entity) { Hibernate.initialize(entity); } /** * @see #initEntity(Object) */ public void initEntity(List<T> entityList) { for (T entity : entityList) { Hibernate.initialize(entity); } } public Query distinct(Query query) { query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); return query; } public Criteria distinct(Criteria criteria) { criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); return criteria; } @SuppressWarnings("rawtypes") public <X> List<X> distinct(List list) { Set<X> set = new LinkedHashSet<X>(list); return new ArrayList<X>(set); } public String getIdName() { ClassMetadata meta = getSessionFactory().getClassMetadata(entityClass); return meta.getIdentifierPropertyName(); } }