我开始就是为了在Hibernate中使用分页才设计这个分页实现的,因为使用Hibernate时,查询后的结果被自动封装到一个List中了,所以使用起来特别方便,这里我做了一个比较庸俗的实现,就是查询参数只适合字符串类型,不过大部分查询还真的只是对字符串操作。 
package treeroot.util; 
import net.sf.hibernate.HibernateException; import treeroot.common.dao.AbstractBaseDao; 
/** * @author treerot * @version 1.0 * @since 2004-9-30 */ public class HibernatePage extends AbstractPage implements Pageable {   private String querySql;   private String countSql;   private String[] parameters; 
  public HibernatePage(int currentPage,String querySql,String countSql,String[] parameters) throws PageException{     this(currentPage,Pageable.DEFAULT_PAGESIZE,querySql,countSql,parameters);   }   public HibernatePage(int currentPage,int pageSize,String querySql,String countSql,String[] parameters) throws PageException   {     super(currentPage, pageSize);     this.querySql = querySql;     this.countSql = countSql;     this.parameters = parameters;     init();   }   protected void init() throws PageException   {     try{         this.count = AbstractBaseDao.queryCount(countSql);        int fromIndex = (this.getCurrentPage() - 1) * this.getPageSize();        int toIndex = Math.min(this.count, fromIndex + this.getPageSize());        this.result = AbstractBaseDao.find(this.querySql,this.parameters,fromIndex,toIndex);     }     catch (HibernateException e)     {        throw new PageException(e.getMessage());     }   } } 这个类的设计并不是很合理的,因为查询只能接受字符串参数,但是如果只需要字符串参数就足够了。另外查询语句必须是JDBC风格的参数(?), 而不是Hibernate风格的(:=),你看过Dao里面的代码就知道为什么了。先看一下如何使用吧(一个Dao中的方法):
  public Pageable findByName(String name,int currentPage) throws PageException{   String countSql="select count(*) from MyClass as c where c.name like ?";   String querySql="from MyClass as c where c.name like ?";   String[] parameter=new String[]{name};   return new HibernatePage(currentPage,countSql,querySql,parameter); } 
  这个方法应该是比较简洁的,这里给出queryCount和find的实现,我对Hibernate的了解比较肤浅,所以下面的方法如果有什么不当的地方还望指出,谢谢! 
public static int queryCount(String hql, String[] args) throws HibernateException {
    if (hql == null) throw new NullPointerException();   Object obj = null;   Transaction trans = null;   Session s = null;   try   {     s = HibernateSessionFactory.currentSession();     trans = s.beginTransaction();     Query q = s.createQuery(hql);     if (args != null)     {       for (int i = 0; i < args.length; i++){         q.setString(i, args[i]);       }     }     obj = q.uniqueResult();     trans.commit();   }   catch (HibernateException e)   {     if (trans != null)     {       try{         trans.rollback();       }       catch (HibernateException ex){//no need to care this Exception }     }     throw e;   }   return ((Integer) obj).intValue(); } 
public static List find(String hql, String[] args, int fromIndex, int toIndex) throws HibernateException {   if (hql == null) throw new NullPointerException();   List l = null;   Transaction trans = null;   Session s = null;   try{     s = HibernateSessionFactory.currentSession();     trans = s.beginTransaction();     Query q = s.createQuery(hql);     if (args != null){       for (int i = 0; i < args.length; i++){         q.setString(i, args[i]);       }     }     if (fromIndex > -1){        if (toIndex > fromIndex){          q.setFirstResult(fromIndex);          q.setMaxResults(toIndex - fromIndex);        }        else{          throw new IndexOutOfBoundsException();        }     }     l = q.list();     trans.commit();    }    catch (HibernateException e){      if (trans != null){        try{          trans.rollback();        }        catch (HibernateException ex){ //no need to care this Exception }      }      throw e;    }    return l; }
   
 
  |