package com.frameworkset.common.hibernate.dao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.type.Type;
import org.framework.orm.ObjectRetrievalFailureException;
import org.framework.orm.hibernate3.support.HibernateDaoSupport;
import com.frameworkset.util.ListInfo;
/**
* <p>Title: BaseDAOHibernate</p>
*
* <p>Description: dao的公共基类,提供了一些公用的数据库查询</p>
*
*
* <p>
* bboss workgroup
* </p>
* <p>
* Copyright (c) 2007
* </p>
*
* @Date 2009-6-1 下午08:58:51
* @author biaoping.yin
* @version 1.0
*/
public class BaseDAOHibernate
extends HibernateDaoSupport
implements DAO,Serializable
{
private static Logger log = Logger.getLogger(BaseDAOHibernate.class);
public BaseDAOHibernate()
{
}
public void removeObject(Object o)
throws DataAccessException
{
getHibernateTemplate().delete(o);
}
public Object getObject(Class clazz, Serializable id)
throws DataAccessException
{
Object o = getHibernateTemplate().get(clazz, id);
if(o == null)
throw new ObjectRetrievalFailureException(clazz, id);
else
return o;
}
public List getObjects(Class clazz)
throws DataAccessException
{
return getHibernateTemplate().loadAll(clazz);
}
public void removeObject(Class clazz, Serializable id)
throws DataAccessException
{
getHibernateTemplate().delete(getObject(clazz, id));
}
public void saveObject(Object o)
throws DataAccessException
{
getHibernateTemplate().save(o);
}
public void updateObject(Object o)
throws DataAccessException
{
getHibernateTemplate().update(o);
}
/**
* 查询类型为clazz的所有记录
* @param clazz Class
* @param start 分页数据起始位置
* @param maxSize 获取记录最大条数
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
*/
public ListInfo getObjects(Class clazz,long start,int maxSize)
throws DataAccessException
{
return find("from " + clazz.getName(), start,maxSize);
}
/**
* 执行预编译分页查询,并且返回查询结果和相关的分页信息(总记录数)
* @param sql String 预编译查询语句
* @param objs Object[] 预编译查询语句参数数组
* @param types Type[] 预编译查询语句参数类型数组
* @param start 分页数据起始位置
* @param maxSize 获取记录最大条数
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
* @deprecated 本方法是与hibernate 2.x兼容而写,替代的方法为protected List find(String sql, Object objs[], Pagination pagination)
*/
public ListInfo find(String sql, Object objs[], Type types[], long start,int maxSize)
throws DataAccessException
{
return find(sql, objs, start,maxSize);
}
/**
* 执行预编译分页查询,并且返回查询结果和相关的分页信息(总记录数)
* @param sql String 预编译查询语句
* @param objs Object[] 预编译查询语句参数数组
* @param types Type[] 预编译查询语句参数类型数组
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
* @deprecated 本方法是与hibernate 2.x兼容而写,替代的方法为protected List find(String sql, Object objs[])
*/
public List find(String sql, Object objs[], Type types[])
throws DataAccessException
{
return super.getHibernateTemplate().find(sql, objs);
}
/**
* 执行预编译分页查询,并且返回查询结果和相关的分页信息(总记录数)
* @param sql String 预编译查询语句
* @param objs Object[] 预编译查询语句参数数组
* @param types Type[] 预编译查询语句参数类型数组
*
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
* @deprecated 本方法是与hibernate 2.x兼容而写,替代的方法为protected List find(String sql, Object objs[])
*/
public List find(String sql, Object objs[])
throws DataAccessException
{
return super.getHibernateTemplate().find(sql, objs);
}
/**
* 执行预编译分页查询,并且返回查询结果和相关的分页信息(总记录数)
* @param sql String 预编译查询语句
* @param objs Object[] 预编译查询语句参数数组
* @param start 分页数据起始位置
* @param maxSize 获取记录最大条数
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
*/
public ListInfo find(String sql, Object objs[],long start,int maxSize)
throws DataAccessException
{
ListInfo listInfo = new ListInfo();
listInfo.setTotalSize(loadTotalSize(sql, objs));
Session session = getSession();
Query sqlQuery = null;
List ls = null;
try
{
sqlQuery = session.createQuery(sql);
if(objs != null && objs.length > 0 )
{
for(int i = 0; i < objs.length; i++)
sqlQuery.setParameter(i, objs[i]);
}
sqlQuery.setFirstResult((int)start).setMaxResults(maxSize);
ls = sqlQuery.list();
if(ls == null)
ls = new ArrayList(0);
}
catch(HibernateException e)
{
log.error(e);
}
listInfo.setDatas(ls);
return listInfo;
}
/**
* 执行分页查询
* @param sql String 查询语句
* @param start 分页数据起始位置
* @param maxSize 获取记录最大条数
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
*/
public ListInfo find(String sql, long start,int maxSize)
throws DataAccessException
{
return find(sql, new Object[0], start, maxSize);
}
/**
* 执行查询
* @param sql String 查询语句
* @return List 结果列表
* @throws DataAccessException
*/
public List find(String sql)
throws DataAccessException
{
return getHibernateTemplate().find(sql);
}
/**
* 执行预编译查询语句,返回结果列表
* @param sql String 预编译语句
* @param obj Object 预编译查询参数值
* @param type Type 预编译查询参数类型
* @param start 分页数据起始位置
* @param maxSize 获取记录最大条数
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
* @deprecated 本方法为与hibernate 2.x兼容而设计的,hibernate 3.x替代的方法为protected List find(String sql, Object obj, Pagination pagination)
*/
public ListInfo find(String sql, Object obj, Type type, long start, int maxSize)
throws DataAccessException
{
return find(sql, obj, start,maxSize);
}
/**
* 执行预编译查询语句,返回结果列表
* @param sql String 预编译语句
* @param obj Object 预编译查询参数值
* @param start 分页数据起始位置
* @param maxSize 获取记录最大条数
* @return ListInfo 封装结果列表和总记录数
* @throws DataAccessException
*/
public ListInfo find(String sql, Object obj,long start, int maxSize)
throws DataAccessException
{
return find(sql, new Object[] {
obj
}, start,maxSize);
}
/**
* 执行预编译查询语句,返回结果列表
* @param sql String 预编译语句
* @param obj Object 预编译查询参数值
* @return List 结果列表
* @throws DataAccessException
*/
public List find(String sql, Object obj)
throws DataAccessException
{
return getHibernateTemplate().find(sql, obj);
}
/**
* 执行预编译sql语句,获取查询结果的总记录数,objs[]数组存放查询参数
* @param sql String
* @param objs Object[]
* @return long
* @throws DataAccessException
*/
public long loadTotalSize(String sql, Object objs[])
throws DataAccessException
{
long count = 0L;
try
{
String midSql = getCountSql(sql);
midSql = "select count(*) " + midSql;
//hibernate 3.x 中对应的方法
List ls = getHibernateTemplate().find(midSql, objs);
if(ls != null && ls.size() > 0)
{
Object obj = ls.get(0);
if(obj instanceof Integer)
count = ((Integer)obj).longValue();
else
if(obj instanceof Long)
count = ((Long)obj).longValue();
}
}
catch(Exception he)
{
log.error(he.getMessage(), he);
}
return count;
}
/**
* 获取记录总数
* 与hibernate 2.x兼容的方法
* @param sql String
* @param objs Object[]
* @param types Type[]
* @return long
* @throws DataAccessException
* @deprecated 替代的方法为protected long loadTotalSize(String sql, Object objs[])
*/
public long loadTotalSize(String sql, Object objs[], Type types[])
throws DataAccessException
{
return loadTotalSize(sql, objs);
}
/**
* 获取hql中的from子句
* @param sql String
* @return String
*/
public String getCountSql(String sql)
{
String midSql = sql;
int count = StringUtils.indexOf(midSql.toLowerCase(), "from");
midSql = StringUtils.substring(midSql, count);
return midSql;
}
/**
* 批量插入
* @param objs Collection
* @return Object
*/
public void batchInsert(Collection objs)
{
getHibernateTemplate().saveOrUpdateAll(objs);
}
/**
* 批量更新
* @param objs Collection
*/
public void batchUpdate(Collection objs)
{
getHibernateTemplate().saveOrUpdateAll(objs);
}
/**
* 批量删除
* @param objs Collection
*/
public void batchDelete(Collection objs)
{
getHibernateTemplate().deleteAll(objs);
}
}