pagetemplateimpl.java

来自「一个很好的jbpm应用实例」· Java 代码 · 共 110 行

JAVA
110
字号
package c20.dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

import c20.helper.PageBean;
import c20.helper.PageResult;

/**
 * 分页模板实现类
 * @author yuxd
 *
 */
public class PageTemplateImpl extends HibernateTemplate implements PageTemplate{
	/**
	 * 缺省构造器
	 */
	public PageTemplateImpl(){
	}
	/**
	 * 带sessionFactory参数的构造器
	 * @param sessionFactory Session工厂对象
	 */
	public PageTemplateImpl(SessionFactory sessionFactory){
		super(sessionFactory);
	}
	
	public PageResult find(String queryString, PageBean pageBean) {
		return find(queryString, (Object[]) null, pageBean);
	}

	public PageResult find(String queryString, Object value, PageBean pageBean) {
		return find(queryString, new Object[] {value}, pageBean);
	}

	public PageResult find(final String queryString, final Object[] values, final PageBean pageBean) {
		/**
		 * 使用HibernateCallback回调接口实现分页HQL查询
		 * 通过定义内部匿名的HibernateCallback类来实现
		 */
		List resultList = (List) execute(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException {
				//创建查询Query对象
				Query queryObject = session.createQuery(queryString);
				prepareQuery(queryObject);
				
				/**
				 * 通过Query对象的setFirstResult()
				 * 与setMaxResults()方法设置分页参数
				 */
				queryObject.setFirstResult((pageBean.getPage()-1)*pageBean.getPageSize());
				queryObject.setMaxResults(pageBean.getPageSize());
				
				/**
				 * 设置占位符对应的查询参数
				 */
				if (values != null) {
					for (int i = 0; i < values.length; i++) {
						queryObject.setParameter(i, values[i]);
					}
				}
				
				//返回查询List列表
				return queryObject.list();
			}
		}, true);
		
		//如果分页信息对象中总记录数小于等于0,查询并设置总记录数
		//if(pageBean.getCount() <= 0){
			//查询总记录数
			String countQuery = getCountQueryString(queryString);
			pageBean.setCount(((Integer)find(countQuery, values).get(0)).intValue());
		//}
		
		//组成分页查询结果对象
		PageResult pageresult = new PageResult();

		pageresult.setResultList(resultList);
		pageresult.setPageBean(pageBean);
		return pageresult;
	}

	/**
	 * 私有辅助方法,得到查询总记录数用的HQL语句
	 * @param queryString 查询HQL语句
	 * @return 查询总记录数用的HQL语句
	 */
	private String getCountQueryString(String queryString){
		String countQuery = "";
		/**
		 * 组成查询总记录数用的HQL语句,
		 * 如果原HQL语句以“SELECT”开头,则使用“select count(*) from (XXXX)”形式;
		 * 否则使用“select count(*) XXXX”形式
		 */
		if(queryString.toUpperCase().startsWith("SELECT")){
			countQuery = "select count(*) from (" + queryString + ")";
		}else{
			countQuery = "select count(*) " + queryString + "";
		}
		
		return countQuery;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?