package com.s.dao;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.s.domain.PNotice;
/**
* extends this class could got HibernateDaoSupport and some usefull method & logger
* @author wangshuai
*/
public class BaseHibernateDao extends HibernateDaoSupport {
Log logger = LogFactory.getLog(this.getClass());
/**
* 根据查询条件与参数列表创建Query对象[供本类内部使用]
* @param session
* @param hql HQL语句
* @param objects 参数
* @return
*/
private Query createQuery(Session s, String hql, Object...params) {
Query q = s.createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
q.setParameter(i, params[i]);
}
}
return q;
}
/**
* 使用hql 语句进行分页操作
* @param hql HQL语句
* @param currentPage 当前页码
* @param pageSize 每页显示多少数据
* @param params 参数
* @return
*/
public List getListForPager(final String hql,final int currentPage,final int pageSize,final Object...params) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Query q = createQuery(s,hql,params);
for (int i=0;i<params.length;i++){
logger.info("par="+params[i]);
}
logger.info("hql="+hql);
q.setFirstResult((currentPage - 1) * pageSize);
q.setMaxResults(pageSize);
List list = q.list();
s.flush();
s.setFlushMode(previous);
return list;
}
});
return list;
}
/**
* 不分页查询,返回满足条件的所有结果集
* @param hql HQL语句
* @param params 参数
* @param max 最大返回结果集数量,如为-1则返回所有结果
* @return
*/
public List getListByHql(final String hql,final int max,final Object...params) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Query q = createQuery(s,hql,params);
if(max != -1){
q.setMaxResults(max);
}
List list = q.list();
s.flush();
s.setFlushMode(previous);
return list;
}
});
return list;
}
/**
* 根据查询条件查询记录数的个数
* @param hql HQL语句
* @param params 参数
* @return
*/
public int getTotalCountForPager(final String hql,final Object...params){
return (Integer)getHibernateTemplate().execute(
new HibernateCallback(){
@Override
public Object doInHibernate(Session s)
throws HibernateException,
SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Query q = createQuery(s, hql, params);
Integer count = Integer.parseInt(q.list().get(0).toString());
s.flush();
s.setFlushMode(previous);
return count;
}
}
);
}
/**
* 使用 QBC 语句进行分页操作
* @param clazz 实体类
* @param currentPage 当前页码
* @param pageSize 每页显示多少数据
* @param criterions
* @return
*/
public List getListForPager(final Class clazz, final int currentPage, final int pageSize,final Criterion...criterions) {
List list = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Criteria criteria = s.createCriteria(clazz);
for (int i = 0; i < criterions.length; i++) {
criteria.add(criterions[i]);
}
criteria.setFirstResult((currentPage - 1) * pageSize);
criteria.setMaxResults(pageSize);
List list = criteria.list();
s.flush();
s.setFlushMode(previous);
return list;
}
});
return list;
}
/**
* 使用 HQL 进行批量更新/删除
* @param hql HQL语句
* @param params 参数
* @return
*/
public int updateByHQL(final String hql,final Object...params){
return (Integer)this.getHibernateTemplate().execute(
new HibernateCallback(){
@Override
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
Query q = createQuery(s,hql,params);
return q.executeUpdate();
}
}
);
}
/**
* 发通知
* @param noticeType 通知类型
* @param noticeTitle 通知标题
* @param noticeContent 通知内容
* @param to 为谁发
*/
public void sendNoticeByType(int noticeType,String noticeTitle,String noticeContent,int to){
PNotice pNotice = new PNotice();
pNotice.setDatatitle(noticeTitle);
pNotice.setDatasort(new Long(noticeType));
pNotice.setDatastr(noticeContent);
pNotice.setPid(new Long(to));
pNotice.setDatastate(new Long(0));
pNotice.setAddtime(new Date());
this.getHibernateTemplate().save(pNotice);
}
/**
* send notice 一次发给多个人
*/
public void sendNoticeByType(int noticeType, String noticeTitle, String noticeContent, Long[] to) {
PNotice pNotice = new PNotice();
pNotice.setDatatitle(noticeTitle);
pNotice.setDatasort(Long.valueOf(noticeType));
pNotice.setDatastr(noticeContent);
pNotice.setDatastate(Long.valueOf(0));
pNotice.setAddtime(new Date());
for(int i=0 ;i<to.length;i++){
pNotice.setPid(to[i]);
this.getHibernateTemplate().save(pNotice);
}
}
/***********Huang Wei************************************************************************/
/**
* 根据查询条件与参数列表创建Query对象[供本类内部使用 SQL]
* @param s
* @param sql
* @param clazz POJO
* @param params
* @return
*/
private Query createSQLQuery(Session s, String sql,Class clazz, Object...params) {
Query q = s.createSQLQuery(sql).addEntity(clazz);
if(params != null){
for (int i = 0; i < params.length; i++) {
q.setParameter(i, params[i]);
}
}
return q;
}
/**
* 根据查询条件与参数列表创建Query对象[供本类内部查总数使用 SQL]
* @param s
* @param sql
* @param clazz POJO
* @param params
* @return
*/
private Query createSQLQuery(Session s, String sql, Object...params) {
Query q = s.createSQLQuery(sql);
if(params != null){
for (int i = 0; i < params.length; i++) {
q.setParameter(i, params[i]);
}
}
return q;
}
/**
* 使用 SQL 语句进行分页操作
* @param sql
* @param currentPage
* @param pageSize
* @param clazz POJO
* @param params
* @return
*/
public List getListForPagerBySQL(final String sql,final int currentPage,final int pageSize,final Class clazz,final Object...params) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Query q = createSQLQuery(s, sql, clazz, params);
q.setFirstResult((currentPage - 1) * pageSize);
q.setMaxResults(pageSize);
List list = q.list();
s.flush();
s.setFlushMode(previous);
return list;
}
});
return list;
}
/**
* 根据sql语句查询
* @param sql
* @param max 等于-1取全部值
* @param clazz POJO
* @param params
* @return
*/
public List getListBySQL(final String sql,final int max,final Class clazz,final Object...params) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Query q = createSQLQuery(s,sql,clazz,params);
if(max != -1){
q.setMaxResults(max);
}
List list = q.list();
s.flush();
s.setFlushMode(previous);
return list;
}
});
return list;
}
/**
* 根据查询条件查询记录数的个数[by sql]
* @param sql
* @param params
* @return
*/
public int getTotalCountForPagerBySQL(final String sql,final Object...params){
return (Integer)getHibernateTemplate().execute(
new HibernateCallback(){
@Override
public Object doInHibernate(Session s)
throws HibernateException,
SQLException {
FlushMode previous = s.getFlushMode();
s.flush();
s.setFlushMode(FlushMode.NEVER);
Query q = createSQLQuery(s, sql,params);
Integer count = Integer.parseInt(q.list().get(0).toString());
s.flush();
s.setFlushMode(previous);
return count;
}
}
);
}
}