package com.wonders.framework.base.dao.impl;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.List;
import javax.annotation.Resource;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.util.StringUtils;
import com.wonders.framework.base.dao.BaseDao;
import com.wonders.framework.util.GenericsUtils;
import com.wonders.framework.util.page.PaginationSupport;
/**
* DAO层封装使用了泛型,包含常用的CURD和分页操作
*
* @author Augus.Gao
*
*
*/
@SuppressWarnings("unchecked")
public abstract class BaseDaoSupport<T> extends HibernateDaoSupport implements
BaseDao<T> {
/** 日志对象 */
protected final Logger log = Logger.getLogger(getClass());
protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(this
.getClass());
protected String entityClassName = getEntityName(this.entityClass);
protected String keyFieldName = getKeyFieldName(this.entityClass);
/** 统一的ID的属性名称:idStr */
public static final String ID_NAME = "id";
// 为父类HibernateDaoSupport注入sessionFactory的值
@Resource(name = "sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
//增加数据权限的查询条件(hql)
private void addPermParam(String hql){
}
/**
* 得到一个初始化好的DetachedCriteria查询对象
*
* @return DetachedCriteria查询对象
* @see org.hibernate.criterion.DetachedCriteria#forClass(Class)
*/
public DetachedCriteria getDetachedCriteria() {
return DetachedCriteria.forClass(entityClass);
}
public void delete(Serializable id) {
T t = this.getEntity(id);
if (t == null) {
return;
}
this.delete(t);
}
public void deleteEntity(Object entity) {
super.getHibernateTemplate().delete(entity);
}
/*
* @see org.usc.daos.DAO#findByEntity(java.lang.Object)
*/
public List<T> findByEntity(Object entiey) {
return super.getHibernateTemplate().findByExample(entiey);
}
public List<T> findCriteria(DetachedCriteria criteria) {
return super.getHibernateTemplate().findByCriteria(criteria);
}
public void fillPageByCriteria(final DetachedCriteria detachedCriteria,final PaginationSupport pagination) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
int totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
if(!StringUtils.isEmpty(pagination.getSidx()) && !StringUtils.isEmpty(pagination.getSord())){
if("asc".equals(pagination.getSord())){
criteria.addOrder(Order.asc(pagination.getSidx()));
}else if("desc".equals(pagination.getSord())){
criteria.addOrder(Order.desc(pagination.getSidx()));
}
}
List<?> items = criteria.setFirstResult(pagination.getStartIndex()).setMaxResults(pagination.getRows()).list();
pagination.setRecords(totalCount);
pagination.setItems(items);
return null;
}
});
}
/*
* @see org.usc.daos.DAO#findByProperty(java.lang.String, java.lang.Object)
*/
public List<T> findByProperty(String propertyName, Object value) {
String queryString = "from " + entityClassName + " o where o."
+ propertyName + "= ?";
return super.getHibernateTemplate().find(queryString, value);
}
public List<T> find(String queryString) {
return super.getHibernateTemplate().find(queryString);
}
public List<Object[]> findHQL(String queryString) {
return super.getHibernateTemplate().find(queryString);
}
/*
* @see org.usc.daos.DAO#delete(java.io.Serializable[])
*/
public void delete(Object... entityids) {
// for (Object id : entityids) {
// super.getHibernateTemplate().delete(find((Serializable) id));
// }
StringBuffer hqlBuf = new StringBuffer();
for (int i = 0, length = entityids.length; i < length; i++) {
hqlBuf.append(",?");
}
String hql = "DELETE " + entityClassName + " WHERE " + ID_NAME
+ " IN (" + hqlBuf.delete(0, 1) + ")";
getHibernateTemplate().bulkUpdate(hql, entityids);
}
/*
* @see org.usc.daos.DAO#find(java.io.Serializable)
*/
public T getEntity(Serializable entityId) {
if (null != entityId)
return (T) super.getHibernateTemplate().get(entityClass, entityId);
return null;
}
/*
* @see org.usc.daos.DAO#getCount()
*/
public int getCount() {
String hql = "select count( " + keyFieldName + ") from "
+ entityClassName;
int count = Integer.parseInt(super.getHibernateTemplate().find(hql)
.get(0).toString());
return count;
}
/*
* @see org.usc.daos.DAO#getCount()
*/
public int getCount(String hql) {
hql = "select count(*) " + hql;
// hql = "select count( " + keyFieldName + ") " + hql;
int count = Integer.parseInt(super.getHibernateTemplate().find(hql)
.get(0).toString());
return count;
}
/*
* @see org.usc.daos.DAO#getCount()
*/
public int getCountHQL(String hql) {
int count = super.getHibernateTemplate().find(hql).size();
return count;
}
public Object create(Object entity) {
return super.getHibernateTemplate().save(entity);
}
/*
* @see org.usc.daos.DAO#update(java.lang.Object)
*/
public void update(Object entity) {
super.getHibernateTemplate().update(entity);
}
/*
* @see org.usc.daos.DAO#getScrollData(int, int, java.lang.String,
* java.lang.Object[], java.util.LinkedHashMap)
*/
public List<T> getScrollData(final int firstindex, final int maxresult,
final String wherejpql, final Object[] queryParams,
final LinkedHashMap<String, String> orderby) {
// final List<T> queryResult = new ArrayList<T>();
return super.getHibernateTemplate().execute(
new HibernateCallback<List<T>>() {
public List<T> doInHibernate(Session session)
throws HibernateException, SQLException {
String hql = "from "
+ entityClassName
+ " o "
+ (wherejpql == null
|| "".equals(wherejpql.trim()) ? ""
: " where " + wherejpql)
+ buildOrderby(orderby);
Query query = session.createQuery(hql);
setQueryParams(query, queryParams);// where
if (firstindex != -1 && maxresult != -1)
query.setFirstResult(firstindex).setMaxResults(
maxresult);
return query.list();
}
});
}
/**
* @see org.usc.daos.DAO#getScrollData(int, int, java.lang.String,
* java.lang.Object[])
*/
public List<T> getScrollData(int firstindex, int maxresult,
String wherejpql, Obje