hibernate基础架构dao

package com.dao;

import java.io.Serializable;

import java.util.Collection;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import org.apache.log4j.Logger;

import org.hibernate.Criteria;

import org.hibernate.HibernateException;

import org.hibernate.Query;

import org.hibernate.SQLQuery;

import org.hibernate.Session;

import org.hibernate.StatelessSession;

import org.hibernate.Transaction;

import org.hibernate.criterion.CriteriaSpecification;

import org.hibernate.criterion.DetachedCriteria;

import org.hibernate.criterion.Example;

import org.hibernate.criterion.MatchMode;

import org.hibernate.criterion.Order;

import org.hibernate.criterion.ProjectionList;

import org.hibernate.criterion.Projections;

import org.hibernate.criterion.Restrictions;

import org.springframework.dao.DataAccessException;

import org.springframework.orm.hibernate4.HibernateCallback;

import org.springframework.orm.hibernate4.HibernateTemplate;

import org.springframework.util.StringUtils;

import com.pojo.CutPage;

/**

 * 

 * 所有方法均可能抛出运行时异常DataAccessException,请谨慎处理

 *

 */

public class BaseDao {

private HibernateTemplate hibernateTemplate;

private final static Logger LOGGER = Logger.getLogger(BaseDao.class);

public Session getSession() {

return getHibernateTemplate().getSessionFactory().openSession();

}

/**

* @param <T>

* @param t

* @param firstResult

* @param maxResult

* @param orderList

* @return

*/

public <T> CutPage findByPageUseLike(final T t, final int firstResult, final int maxResult, final List<Order> orderList, String tableAndColumn) {

final Example example = Example.create(t).excludeZeroes().enableLike(MatchMode.ANYWHERE);

return getHibernateTemplate().execute(new CallbackFindByPageUseLike(example, firstResult, maxResult, t.getClass(), orderList, tableAndColumn));

}

/**

* 离线查询,一般用于复杂查询

* @param detachedCriteria

* @return

*/

public List<?> findByPage(final DetachedCriteria detachedCriteria) {

return getHibernateTemplate().findByCriteria(detachedCriteria);

}

/**

* 离线分页查询,一般用于复杂分页查询

* @param <T>

* @param detachedCriteria

* @param firstResult

* @param maxResult

* @return

*/

public <T> CutPage findByPage(final DetachedCriteria detachedCriteria, final int firstResult, final int maxResult) {

return getHibernateTemplate().executeWithNativeSession(new CallbackFindByPageUseCriteria(detachedCriteria, firstResult, maxResult));

}

public <T> CutPage findByPageX(final DetachedCriteria detachedCriteria, final int firstResult, final int maxResult, ProjectionList p, String distinctColumn,

String orderColumn) {

return getHibernateTemplate()

.executeWithNativeSession(new CallbackFindByPageUseCriteriaX(detachedCriteria, firstResult, maxResult, p, distinctColumn, orderColumn));

}

public <T> void saveOrUpdate(T t) {

if (t == null) {

LOGGER.error("no entity!");

}

else {

LOGGER.info("save or update " + t.getClass().getName());

getHibernateTemplate().saveOrUpdate(t);

}

}

public <T> void batchInsert(List<T> ts) {

StatelessSession session = getHibernateTemplate().getSessionFactory().openStatelessSession();

Transaction tx = session.beginTransaction();

for (T t : ts) {

if (t == null) {

LOGGER.error("batchInsert:no entity");

}

else {

LOGGER.info("batchInsert:save or update" + t.getClass().getName());

session.insert(t);

}

}

tx.commit();

session.close();

}

/**

* 由传入对象构造Example对象的模糊分页查询

* @param <T>

* @param t

* @param firstResult

* @param maxResult

* @return

*/

public <T> CutPage findByPageUseLike(final T t, final int firstResult, final int maxResult) {

final Example example = Example.create(t).excludeZeroes().enableLike(MatchMode.ANYWHERE);

return getHibernateTemplate().execute(new CallbackFindByPageUseLike(example, firstResult, maxResult, t.getClass(), null, null));

}

/**

* @param <T>

* @param t

* @param firstResult

* @param maxResult

* @param orderList

* @return

*/

public <T> CutPage findByPageUseLike(final T t, final int firstResult, final int maxResult, final List<Order> orderList) {

final Example example = Example.create(t).excludeZeroes().enableLike(MatchMode.ANYWHERE);

return getHibernateTemplate().execute(new CallbackFindByPageUseLike(example, firstResult, maxResult, t.getClass(), orderList, null));

}

public <T> void toUpdate(T t) {

if (t == null) {

LOGGER.error("no entity!");

}

else {

LOGGER.info("save or update " + t.getClass().getName());

getHibernateTemplate().update(t);

}

}

public <T> void delete(T t) {

getHibernateTemplate().delete(t);

}

public <T> void delete(Class<T> entityClass, Integer id) {

LOGGER.info("delete " + entityClass.getClass().getName());

getHibernateTemplate().delete(get(entityClass, id));

}

public <T> T get(Class<T> entityClass, Integer id) {

return getHibernateTemplate().get(entityClass, id);

}

/**

* 根据id查询

* @param hql

* @param entityClass

* @return

*/

public <T> T get(Class<T> entityClass, Serializable id) {

return getHibernateTemplate().get(entityClass, id);

}

/**

* 根据传入对象查询

* @param <T>

* @param t

* @return

*/

public <T> List<T> find(T t) {

return getHibernateTemplate().findByExample(t);

}

public <T> T findOne(T t) {

List<T> list = null;

try {

list = getHibernateTemplate().findByExample(t, 0, 1);

}

catch (DataAccessException e) {

LOGGER.error(e, e);

}

if (list == null || list.size() == 0) {

return null;

}

return list.get(0);

}

@SuppressWarnings({ "unchecked", "rawtypes" })

public <T> List<T> findUseLike(final T t) {

final Example example = Example.create(t).excludeZeroes().enableLike(MatchMode.ANYWHERE);

return getHibernateTemplate().execute((HibernateCallback<List<T>>) new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException {

return session.createCriteria(t.getClass()).add(example).list();

}

});

}

public <T> List<T> findAll(Class<T> entityClass) {

return getHibernateTemplate().loadAll(entityClass);

}

public <T> List<T> findAll(String hql, Class<T> entityClass) {

return findAll(hql, entityClass, new Object[] {});

}

public <T> List<T> findAll(String hql, Class<T> entityClass, Object param) {

return findAll(hql, entityClass, new Object[] { param });

}

public <T> List<T> findAll(String hql, Class<T> entityClass, Object[] params) {

return getHibernateTemplate().execute(new CallbackByQuery<T>(hql, params));

}

public List<Object[]> findAllBySql(String sql) {

return findAllBySql(sql, new Object[] {});

}

public List<Object[]> findAllBySql(String sql, Object param) {

return findAllBySql(sql, new Object[] { param });

}

public List<Object[]> findAllBySql(String sql, Object[] params) {

return getHibernateTemplate().execute(new CallbackBySqlQuery(sql, params));

}

public List<Object> findAllBySql3(String sql, Object[] params) {

return getHibernateTemplate().execute(new CallbackBySqlQuery3(sql, params));

}

public List<Object[]> findAllBySql2(String sql, Map<String, Object> params) {

return getHibernateTemplate().execute(new CallbackBySqlQuery2(sql, params));

}

public <T> List<T> findByPage(String hql, Class<T> entityClass, int firstResult, int maxResult) {

return findByPage(hql, entityClass, new Object[] {}, firstResult, maxResult);

}

public <T> List<T> findByPage(String hql, Class<T> entityClass, Object param, int firstResult, int maxResult) {

return findByPage(hql, entityClass, new Object[] { param }, firstResult, maxResult);

}

public <T> List<T> findByPage(String hql, Class<T> entityClass, Object[] params, int firstResult, int maxResult) {

return getHibernateTemplate().execute(new CallbackByQuery<T>(hql, params, firstResult, maxResult));

}

public int updateBySql(String sql, Object... params) {

return getHibernateTemplate().execute(new CallbackBySqlDML(sql, params));

}

public List<Map<String, Object>> findAllBySql(String sql, Object[] params, List<String> titles) {

List<Object[]> result = findAllBySql(sql, params);

List<Map<String, Object>> list = new LinkedList<Map<String, Object>>();

for (Object[] objs : result) {

Map<String, Object> map = new HashMap<String, Object>();

list.add(map);

for (int i = 0; i < titles.size(); i++) {

map.put(titles.get(i), objs.length > i ? objs[i] : null);

}

}

return list;

}

public List<Map<String, Object>> findAllBySqlToMap(String sql) {

return findAllBySqlToMap(sql, new Object[] {});

}

public List<Map<String, Object>> findAllBySqlToMap(String sql, Object param) {

return findAllBySqlToMap(sql, new Object[] { param });

}

public List<Map<String, Object>> findAllBySqlToMap(String sql, Object[] params) {

return getHibernateTemplate().execute(new CallbackBySqlQueryMap(sql, params));

}

public HibernateTemplate getHibernateTemplate() {

return hibernateTemplate;

}

public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

this.hibernateTemplate = hibernateTemplate;

}

private class CallbackByQuery<T> implements HibernateCallback<List<T>> {

private String hql;

private Object[] params;

private boolean isByPage = false;

private int firstResult;

private int maxResult;

public CallbackByQuery(String hql, Object[] params) {

super();

this.hql = hql;

this.params = params;

}

public CallbackByQuery(String hql, Object[] params, int firstResult, int maxResult) {

super();

this.hql = hql;

this.params = params;

this.isByPage = true;

this.firstResult = firstResult;

this.maxResult = maxResult;

}

@Override

public List<T> doInHibernate(Session session) throws HibernateException {

Query query = session.createQuery(hql);

for (int i = 0; i < params.length; i++) {

query.setParameter(i, params[i]);

}

if (isByPage) {

query.setFirstResult(firstResult);

query.setMaxResults(maxResult);

}

@SuppressWarnings("unchecked")

List<T> list = query.list();

return list;

}

}

private class CallbackBySqlQuery implements HibernateCallback<List<Object[]>> {

private String sql;

private Object[] params;

public CallbackBySqlQuery(String sql, Object[] params) {

super();

this.sql = sql;

this.params = params;

}

@Override

public List<Object[]> doInHibernate(Session session) throws HibernateException {

LOGGER.info(sql);

SQLQuery query = session.createSQLQuery(sql);

for (int i = 0; i < params.length; i++) {

query.setParameter(i, params[i]);

}

@SuppressWarnings("unchecked")

List<Object[]> list = query.list();

return list;

}

}

private class CallbackBySqlQuery2 implements HibernateCallback<List<Object[]>> {

private String sql;

private Map<String, Object> params;

public CallbackBySqlQuery2(String sql, Map<String, Object> params) {

super();

this.sql = sql;

this.params = params;

}

@Override

public List<Object[]> doInHibernate(Session session) throws HibernateException {

LOGGER.info(sql);

SQLQuery query = session.createSQLQuery(sql);

Object obj;

String key;

for (Map.Entry<String, Object> entry : this.params.entrySet()) {

obj = entry.getValue();

key = entry.getKey();

if (obj instanceof Collection<?>) {

query.setParameterList(key, (Collection<?>) obj);

}

else if (obj instanceof Object[]) {

query.setParameterList(key, (Object[]) obj);

}

else {

query.setParameter(key, obj);

}

}

@SuppressWarnings("unchecked")

List<Object[]> list = query.list();

return list;

}

}

private class CallbackBySqlQuery3 implements HibernateCallback<List<Object>> {

private String sql;

private Object[] params;

public CallbackBySqlQuery3(String sql, Object[] params) {

super();

this.sql = sql;

this.params = params;

}

@Override

public List<Object> doInHibernate(Session session) throws HibernateException {

LOGGER.info(sql);

SQLQuery query = session.createSQLQuery(sql);

for (int i = 0; i < params.length; i++) {

query.setParameter(i, params[i]);

}

@SuppressWarnings("unchecked")

List<Object> list = query.list();

return list;

}

}

private class CallbackBySqlQueryMap implements HibernateCallback<List<Map<String, Object>>> {

private String sql;

private Object[] params;

public CallbackBySqlQueryMap(String sql, Object[] params) {

super();

this.sql = sql;

this.params = params;

}

@Override

public List<Map<String, Object>> doInHibernate(Session session) throws HibernateException {

LOGGER.info(sql);

SQLQuery query = session.createSQLQuery(sql);

for (int i = 0; i < params.length; i++) {

query.setParameter(i, params[i]);

}

//设定结果结果集中的每个对象为Map类型

query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);

@SuppressWarnings("unchecked")

List<Map<String, Object>> list = query.list();

return list;

}

}

private class CallbackBySqlDML implements HibernateCallback<Integer> {

private String sql;

private Object[] params;

public CallbackBySqlDML(String sql, Object[] params) {

super();

this.sql = sql;

this.params = params;

}

@Override

public Integer doInHibernate(Session session) throws HibernateException {

SQLQuery query = session.createSQLQuery(sql);

for (int i = 0; params != null && i < params.length; i++) {

query.setParameter(i, params[i]);

}

return query.executeUpdate();

}

}

private class CallbackFindByPageUseCriteria implements HibernateCallback<CutPage> {

private int firstResult;

private int maxResult;

private DetachedCriteria detachedCriteria;

public CallbackFindByPageUseCriteria(DetachedCriteria detachedCriteria, int firstResult, int maxResult) {

super();

this.firstResult = firstResult;

this.maxResult = maxResult;

this.detachedCriteria = detachedCriteria;

}

@Override

public CutPage doInHibernate(Session session) throws HibernateException {

CutPage cutPage = new CutPage();

Criteria criteria = detachedCriteria.getExecutableCriteria(session);

criteria.setProjection(Projections.rowCount());

cutPage.setCount(Integer.parseInt(criteria.uniqueResult().toString()));

criteria.setProjection(null);

cutPage.setList(criteria.setMaxResults(maxResult).setFirstResult(firstResult).list());

return cutPage;

}

}

private class CallbackFindByPageUseLike implements HibernateCallback<CutPage> {

private int firstResult;

private int maxResult;

private Example example;

@SuppressWarnings("rawtypes")

private Class entityClass;

private List<Order> orderList;

private String tableAndColumn;

@SuppressWarnings("rawtypes")

public CallbackFindByPageUseLike(Example example, int firstResult, int maxResult, Class entityClass, List<Order> orderList, String tableAndColumn) {

super();

this.firstResult = firstResult;

this.maxResult = maxResult;

this.example = example;

this.entityClass = entityClass;

this.orderList = orderList;

this.tableAndColumn = tableAndColumn;

}

@Override

public CutPage doInHibernate(Session session) throws HibernateException {

CutPage cutPage = new CutPage();

Criteria criteria = session.createCriteria(entityClass).add(example);

if (tableAndColumn != null && !tableAndColumn.equals("")) {

if (tableAndColumn.contains("+")) {

int index = tableAndColumn.indexOf("+");

String tableName = tableAndColumn.substring(0, index);

if (tableName.equals("customer")) {

String columnName = tableAndColumn.substring(index + 1, tableAndColumn.length());

criteria.add(Restrictions.neOrIsNotNull(columnName, ""));

}

else if (tableName.equals("selected")) {

String columnName = tableAndColumn.substring(index + 1, tableAndColumn.length());

criteria.add(Restrictions.neOrIsNotNull(columnName, ""));

}

}

}

if (orderList != null && orderList.size() > 0) {

for (Order order : orderList) {

criteria.addOrder(order);

}

}

criteria.setProjection(Projections.rowCount());

cutPage.setCount(Integer.parseInt(criteria.uniqueResult().toString()));

criteria.setProjection(null);

cutPage.setList(criteria.setMaxResults(maxResult).setFirstResult(firstResult).list());

return cutPage;

}

}

private class CallbackFindByPageUseCriteriaX implements HibernateCallback<CutPage> {

private int firstResult;

private int maxResult;

private DetachedCriteria detachedCriteria;

private ProjectionList queryProjection;

private String distinctColumn;

private String orderColumn;

public CallbackFindByPageUseCriteriaX(DetachedCriteria detachedCriteria, int firstResult, int maxResult, ProjectionList p, String distinctColumn,

String orderColumn) {

super();

this.firstResult = firstResult;

this.maxResult = maxResult;

this.detachedCriteria = detachedCriteria;

this.queryProjection = p;

this.distinctColumn = distinctColumn;

this.orderColumn = orderColumn;

}

@Override

public CutPage doInHibernate(Session session) throws HibernateException {

CutPage cutPage = new CutPage();

Criteria criteria = detachedCriteria.getExecutableCriteria(session);

criteria.setProjection(Projections.rowCount());

if (!StringUtils.isEmpty(distinctColumn)) {

criteria.setProjection(Projections.projectionList().add(Projections.countDistinct(distinctColumn)));

}

else {

criteria.setProjection(Projections.rowCount());

}

cutPage.setCount(Integer.parseInt(criteria.uniqueResult().toString()));

criteria.setProjection(queryProjection);

if (!StringUtils.isEmpty(orderColumn)) {

criteria.addOrder(Order.desc(orderColumn));

}

cutPage.setList(criteria.setMaxResults(maxResult).setFirstResult(firstResult).list());

return cutPage;

}

}

}

猜你喜欢

转载自wangelectronic.iteye.com/blog/2374782