现在展示在大家面前的是查询分页两个核心类 :AbstractSearch(预查询初始化程序)、AbstractList(分页及初始化分页程序),代码如下:
/********************************AbstractSearch类************************************/
package com.nyhr.struts.frame;
import java.util.List;
import com.nyhr.struts.beans.HibernateUtil;
/**
* <p>Title: 预查询初始化程序</p>
* <p>Description: 所有的初始化查询必须继承此类,本类只负责预查询ID集和Page对象的初始化,不实现显示逻辑</p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: 四方人才网</p>
* @author Yeno.hhr
* @version 1.0
*/
public abstract class AbstractSearch {
public AbstractSearch()
{
super();
}
/**
* 根据HQL查询出记录的主键ID(主索引)集合
* 注:此hql必须是只检索主键及复合主键的查询语句,具体见应用实例
* @param hql 不带查询的查询语句
* @return idArray 主索引集合(可以主键ID,也可以是复合ID)
*/
public Object[] getIDList(String hql)
{
List list = HibernateUtil.query(hql);
if (list==null || list.size()==0)
return null;
return list.toArray();
}
/**
* 根据HQL查询出记录的主键ID(主索引)集合
* 注:此hql必须是只检索主键及复合主键的查询语句,具体见应用实例
* @param hql 带参数的查询语句
* @param bean 参数设置实体类
* @return Object[] 主索引集合(可以主键ID,也可以是复合ID)
*/
public Object[] getIDList(String hql, Object bean)
{
List list = HibernateUtil.query(hql,bean);
if (list==null || list.size()==0)
return null;
return list.toArray();
}
/**子类方法:根据子类的需要选择调用AbstractSearch的“带参”和“不带参”两种查询中的一种返回主键ID的数组集*/
abstract public Object[] getList();
/**子类方法:设定查询条件*/
abstract protected void condition();
}
/********************************AbstractList类************************************/
package com.nyhr.struts.frame;
import com.nyhr.struts.page.*;
import com.nyhr.struts.constant.SysConstant;
import com.nyhr.struts.hibernate.HibernateSessionFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import java.util.List;
import java.util.ArrayList;
/**
* <p>Title: 分页及初始化分页程序</p>
* <p>Description: 所有的初始化分页必须继承此类,如果是预查询调用,同时会初始化Page实体,否则Page实体会由FormBean提交生成</p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: 四方人才网</p>
* @author Yeno.hhr
* @version 1.0
*/
abstract public class AbstractList {
private Page page;
/**查询结果的主键ID集*/
private Object[] idList;
public AbstractList(){}
/**
* 预查询初始化分页构造(初次查询)
* @param hql 查询语句
* @param search 预查询类
*/
public AbstractList(AbstractSearch search){
this.idList=search.getList();
}
/**
* 查询分页构造(分页查询)
* @param page 分页状态实体
* @param idList
*/
public AbstractList(Page page, Object[] idList){
this.idList=idList;
this.page=page;
}
/**子类方法:设置分页查询的查询语句*/ abstract protected String getHql(); /** * 返回查询结果 * @return Result */ public Result getResult(){ if(page==null){ if(idList==null) this.page = PageUtil.createPage(SysConstant.PAGE_SIZE,1,0); else this.page = PageUtil.createPage(SysConstant.PAGE_SIZE,1,idList.length); } return new Result(page, getListByPage()); } /** * 分页查询,返回当前页的查询结果集 * @param hql * @return list 结果集 */ public List getListByPage(){ List list = null; if (page.getTotalPage() < 1) return list; try{ String hql=getHql(); if(hql==null || hql.equals("")) return list; Object[] bean=getCurrentIds(); if(bean!=null) list=HibernateUtil.query(hql,bean); else list=HibernateUtil.query(hql); }catch(Exception e){ System.out.println(e.getMessage()); throw new RuntimeException(e); } return list; }
/** * 从查询结果的ID集中找出当前页的ID集 * @param arr 所有查询结果的主键ID集 * @return Object[] */ private Object[] getCurrentIds(){ if(idList==null) return null; ArrayList<Object> list = new ArrayList<Object>(); int begin = page.getBeginIndex(); int ends = page.getTotalRecords(); int end = begin+page.getEveryPage(); if (end >= ends) end = ends; for (int l=begin;l<end;l++){ list.add(idList[l]); } return list.toArray(); } /** * 返回查询结果主键ID集的字符串组合形式 * @return String */ public String getIdList(){ String ids=""; if(idList == null) return ids; for(int x=0; x<idList.length; x++){ ids+=idList[x].toString(); if(x<idList.length-1) ids+=","; } return ids; }}/********************************HibernateUtil类************************************/public class HibernateUtil { private HibernateUtil(){} /** * 执行数据库查询,返回结果集List * @param hsql HSQL查询语句 * @return list 结果集 */ public static List query(String hql) { List list = null; Query query = null; Session sess = HibernateSessionFactory.currentSession(); try{ //创建一条HQL查询语句 if (hql.toLowerCase().contains("from ")) query = sess.createQuery(hql); else query = sess.getNamedQuery(hql); list = query.list(); }catch(HibernateException e) { System.out.println("Hibernate Exception:@"+e.getMessage()); throw new RuntimeException(e); }finally { HibernateSessionFactory.closeSession(); } return list; } public static List query(String hql, Object bean){ List list = null; Query query = null; Session sess = HibernateSessionFactory.currentSession(); try { //创建一条HQL查询语句 if (hql.toLowerCase().contains("from ")) query = sess.createQuery(hql); else query = sess.getNamedQuery(hql); query.setProperties(bean); list = query.list(); }catch(HibernateException e) { System.out.println("Hibernate Exception:@"+e.getMessage()); throw new RuntimeException(e); } finally { HibernateSessionFactory.closeSession(); } return list; }}