一个简洁的分页实现(三)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我开始就是为了在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();

}

publicstatic 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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航