package ccp.stock.service.base;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import ccp.stock.util.PaginationSupport;
/**
* @author haohao
* @since 2007-2-12 对spring HibernateDaoSupport继承
*/
public class AbstractService extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(AbstractService.class);
/**
* 默认cache 为false
*/
private boolean cacheQueries = false;
private String queryCacheRegion;
/**
* 初始化 Dao
* @see org.springframework.dao.support.DaoSupport#initDao()
*/
@Override
protected void initDao() throws Exception {
super.initDao();
getHibernateTemplate().setCacheQueries(cacheQueries);
if (queryCacheRegion != null) {
getHibernateTemplate().setQueryCacheRegion(queryCacheRegion);
}
}
/**
* @param cacheQueries
* AbstractService.java ccp.stock.service.base 下午02:51:23
*/
public void setCacheQueries(final boolean cacheQueries) {
this.cacheQueries = cacheQueries;
}
/**
* @param queryCacheRegion
* AbstractService.java ccp.stock.service.base 下午02:53:14
*/
public void setQueryCacheRegion(final String queryCacheRegion) {
this.queryCacheRegion = queryCacheRegion;
}
/**
* 保存一个class
* @param entity
* @return boolean AbstractService.java ccp.stock.service.base 下午02:52:38
*/
public boolean create(final Object entity) {
try {
this.getHibernateTemplate().save(entity);
return true;
} catch (final RuntimeException re) {
AbstractService.log.error("create failed", re);
throw re;
}
}
/**
* 更新一个class
* @param entity
* @return boolean AbstractService.java ccp.stock.service.base 下午02:53:55
*/
public boolean update(final Object entity) {
try {
getHibernateTemplate().update(entity);
return true;
} catch (final RuntimeException re) {
AbstractService.log.error("update failed", re);
throw re;
}
}
/**
* 删除一个class
*
* @param entity
* @return boolean AbstractService.java ccp.stock.service.base 下午02:54:33
*/
public boolean remove(final Object entity) {
try {
getHibernateTemplate().delete(entity);
return true;
} catch (final RuntimeException re) {
AbstractService.log.error("delete failed", re);
throw re;
}
}
/**
* load class
*
* @param entity
* @param id
* @return Object AbstractService.java ccp.stock.service.base 下午02:55:22
*/
public Object loadById(final Class entity, final Serializable id) {
return getHibernateTemplate().get(entity, id);
}
/**
* 查看所有
*
* @param entity
* @return List AbstractService.java ccp.stock.service.base 下午02:56:06
*/
public List findAll(final Class entity) {
return getHibernateTemplate().find("from " + entity.getName());
}
/**
* @param namedQuery
* @return List AbstractService.java ccp.stock.service.base 下午02:56:55
*/
public List findByNamedQuery(final String namedQuery) {
return getHibernateTemplate().findByNamedQuery(namedQuery);
}
/**
* pojo.xml queryName有参数
*
* @param query
* @param parameter
* @return List AbstractService.java ccp.stock.service.base 下午02:57:23
*/
public List findByNamedQuery(final String query, final Object parameter) {
return getHibernateTemplate().findByNamedQuery(query, parameter);
}
/**
* pojo*_.xml queryName[]有参数
*
* @param query
* @param parameters
* @return List AbstractService.java ccp.stock.service.base 下午02:58:07
*/
public List findByNamedQuery(final String query, final Object[] parameters) {
return getHibernateTemplate().findByNamedQuery(query, parameters);
}
/**
* 查找的class对象
*
* @param query
* @return List AbstractService.java ccp.stock.service.base 下午02:59:23
*/
public List find(final String query) {
return getHibernateTemplate().find(query);
}
/**
* 查找
*
* @param entity
* @param c
* @param startIndex
* @param count
* @param orders
* @return List AbstractService.java ccp.stock.service.base 下午03:00:26
*/
@SuppressWarnings("unchecked")
public List find(final Class entity, final Criterion criterion,
final int startIndex, final int count, final List<Order> orders) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(final Session session)
throws HibernateException, SQLException {
final Criteria criteria = session.createCriteria(entity);
if (criterion != null) {
criteria.add(criterion);
}
if (orders != null) {
for (Order element : orders) {
criteria.addOrder(element);
}
}
criteria.setFirstResult(startIndex);
criteria.setMaxResults(count);
return criteria.list();
}
});
}
/**
* 查找的class对象
* @param entity
* @param c
* @param ps
* @return PaginationSupport 返回 分页封装 AbstractService.java
* ccp.stock.service.base 下午03:01:02
*/
public PaginationSupport find(final Class entity,
final Criterion criterion, final PaginationSupport ps) {
return find(entity, criterion, ps, null,null);
}
/**
* @param entity
* @param c
* 查找的class对象
* @param ps
* 分页封装
* @param orders
* 排序集合
* @return PaginationSupport 返回 分页封装 AbstractService.java
* ccp.stock.service.base 下午03:01:44
*/
@SuppressWarnings("unchecked")
public PaginationSupport find(final Class entity,
final Criterion criterion, final PaginationSupport ps,
final List<Order> orders) {
return find(entity, criterion, ps, orders,null);
}
//分组分页
public PaginationSupport find(final Class entity,
final Criterion criterion, final PaginationSupport ps,
final List<Order> orders, final String groupStr) {
return (PaginationSupport) getHibernateTemplate().execute(
new HibernateCallback() {
@SuppressWarnings("unchecked")
public Object doInHibernate(final Session session)
throws HibernateException, SQLException {
final Criteria criteria = session
.createCriteria(entity);
if (criterion != null) {
criteria.add(criterion);
}
final int totalCount = ((Integer) criteria
.setProjection(Projections.rowCount())
.uniqueResult()).intValue(); // 记录总数
ps.setTotalCount(totalCount);
criteria.setProjection(null);
if(groupStr!=null){
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty(groupStr)));
}
if (orders != null) {
for (final Order element : orders) {
criteria.addOrder(element);
}
}
criteria.setProjection(null);
criteria.setFirstResult(ps.getStartIndex())
.setMaxResults(ps.getCountOnEachPage());
final List list = criteria.list();
ps.setItems(list);
return ps;
}
});
}
/**
* query分页
*/
@SuppressWarnings("unchecked")
public PaginationSupport find(Query query,final PaginationSupport ps){
ps.setTotalCount(query.list().size());
query.setFirstResult(ps.getStartIndex());
query.setMaxResults(ps.getCountOnEachPage());
ps.setItems(query.list());
return ps;
}
}
