import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.hibernate.Session; import org.hibernate.Query; import org.hibernate.HibernateException; import java.sql.SQLException; import java.util.List; /** * Description: * <br/>网站: <a href="http://www.crazyit.org" mce_href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2010, Leeyohn * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author Leeyohn leeyohn@hotmail.com * @version 1.0 */ public class ExtendHibernateDaoSupport extends HibernateDaoSupport { /** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final int offset, final int pageSize) { return getListByParam(hql, offset, pageSize, null, false); } /** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param args 如果hql有多个个参数需要传入,args就是传入hql的参数数组 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final int offset , final int pageSize, final Object... args) { return getListByParam(hql, offset, pageSize, args, false); } /** * 使用hql语句进行分页查询 * @param queryNamed 需要查询的命名HQL * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByNamedQueryAndPage(final String queryNamed, final int offset, final int pageSize) { return getListByParam(queryNamed, offset, pageSize, null, true); } /** * 使用hql语句进行分页查询 * @param queryNamed 需要查询的命名HQL * @param args 如果hql有多个个参数需要传入,args就是传入hql的参数数组 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByNamedQueryAndPage(final String queryNamed, final int offset, final int pageSize, final Object... args) { return getListByParam(queryNamed, offset, pageSize, args, true); } /** * 辅助方法 * @param str 需要查询的HQL语句或命名查询字符串 * @param args 如果hql有多个个参数需要传入,args就是传入hql的参数数组 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @param isNamedQuery 是否命名查询 * @return 当前页的所有记录 */ private List getListByParam(final String str, final int offset , final int pageSize, final Object[] args, final boolean isNamedQuery) { //通过一个HibernateCallback对象来执行查询 List list = getHibernateTemplate() .executeFind(new HibernateCallback() { //实现HibernateCallback接口必须实现的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //获取Query对象 Query query = (isNamedQuery? session.getNamedQuery(str) : session.createQuery(str)); //设置起始页和每页显示的记录数 query.setFirstResult(offset).setMaxResults(pageSize); if (args == null) { return query.list(); } else { for (int i = 0; i < args.length; i++) { query.setParameter(i, args[i]); } return query.list(); } } }); return list; } }