hibernate分页工具类,附带具体的分页方法
调用效果:
//查询说说
PageBean page= null;
page = new QueryHelper(Talk.class, "t")
.addCondition("t.user.id=?",visitUser.getId())
.addCondition("t.status=?", Talk.INT_VALUE_0)
.addCondition(isUser == VISITUSER_ROLE_2, "t.visibleRange in (?,?)",Talk.INT_VALUE_2,Talk.INT_VALUE_3)
.addCondition(isUser == VISITUSER_ROLE_3, "t.visibleRange in (?)",Talk.INT_VALUE_3)
.addCondition(timestamp!=0,"t.posttime<?",timestamp)
.addOrderProperty("t.posttime",false)
.preparePageBean(talkService, pageNum, pageSize);
1,分页工具类(QueryHelper.java)
package com.hl.zoneSystem_v01.utils;
import java.util.ArrayList;
import java.util.List;
import com.hl.zoneSystem_v01.domain.PageBean;
import com.hl.zoneSystem_v01.service.BaseService;
/**
* 用于辅助拼接HQL语句
*
* @author hl
*
*/
public class QueryHelper {
//private String fromClause; // FROM子句
//private String whereClause = ""; // Where子句
//private String orderByClause = ""; // OrderBy子句
private StringBuffer fromClause = new StringBuffer(); // FROM子句
private StringBuffer whereClause = new StringBuffer(); // Where子句
private StringBuffer orderByClause = new StringBuffer(); // OrderBy子句
private List<Object> parameters = new ArrayList<Object>(); // 参数列表
/**
* 生成From子句
* @param <T>
*
* @param clazz
* @param alias
* 别名
*/
public <T> QueryHelper(Class<T>clazz, String alias) {
//fromClause = "FROM " + clazz.getSimpleName() + " " + alias;
fromClause.append("FROM ").append(clazz.getSimpleName()).append(" ").append(alias);
}
/**
* 拼接Where子句
*
* @param condition
* @param params
*/
public QueryHelper addCondition(String condition, Object... params) {
// 拼接
if (whereClause.length() == 0) {
//whereClause = " WHERE " + condition;
whereClause.append(" WHERE ").append(condition);
} else {
//whereClause += " AND " + condition;
whereClause.append(" AND ").append(condition);
}
// 参数
if (params != null) {
for (Object p : params) {
parameters.add(p);
}
}
return this;
}
/**
* 如果第一个参数为true,则拼接Where子句
*
* @param append
* @param condition
* @param params
*/
public QueryHelper addCondition(boolean append, String condition, Object... params) {
if (append) {
addCondition(condition, params);
}
return this;
}
/**
* 拼接where子句 已or的形式
*/
public QueryHelper addOrCondition(String condition, Object... params) {
// 拼接
if (whereClause.length() == 0) {
//whereClause = " WHERE " + condition;
whereClause.append(" WHERE ").append(condition);
} else {
//whereClause += " OR " + condition;
whereClause.append(" OR ").append(condition);
}
// 参数
if (params != null) {
for (Object p : params) {
parameters.add(p);
}
}
return this;
}
/**
* 如果第一个参数为true,则拼接Where子句 or形式
*
* @param append
* @param condition
* @param params
*/
public QueryHelper addOrCondition(boolean append, String condition, Object... params) {
if (append) {
addOrCondition(condition, params);
}
return this;
}
/**
* 拼接OrderBy子句
*
* @param propertyName
* 参与排序的属性名
* @param asc
* true表示升序,false表示降序
*/
public QueryHelper addOrderProperty(String propertyName, boolean asc) {
if (orderByClause.length() == 0) {
//orderByClause = " ORDER BY " + propertyName + (asc ? " ASC" : " DESC");
orderByClause.append(" ORDER BY ").append(propertyName).append((asc ? " ASC" : " DESC"));
} else {
//orderByClause += ", " + propertyName + (asc ? " ASC" : " DESC");
orderByClause.append(", ").append(propertyName).append((asc ? " ASC" : " DESC"));
}
return this;
}
/**
* 如果第一个参数为true,则拼接OrderBy子句
*
* @param append
* @param propertyName
* @param asc
*/
public QueryHelper addOrderProperty(boolean append, String propertyName, boolean asc) {
if (append) {
addOrderProperty(propertyName, asc);
}
return this;
}
/**
* 获取生成的用于查询数据列表的HQL语句
*
* @return
*/
public String getListQueryHql() {
return fromClause.toString() + whereClause.toString() + orderByClause.toString();
}
/**
* 获取生成的用于查询总记录数的HQL语句
*
* @return
*/
public String getCountQueryHql() {
StringBuffer sCount = new StringBuffer();
sCount.append("SELECT COUNT(*) ").append(fromClause.toString()).append(whereClause.toString());
//return "SELECT COUNT(*) " + fromClause + whereClause;
return sCount.toString();
}
/**
* 获取HQL中的参数值列表
*
* @return
*/
public List<Object> getParameters() {
return parameters;
}
/**
* 查询分页信息,并放到值栈栈顶
*
* @param service
* @param pageNum
* @param pageSize
*/
public PageBean preparePageBean(BaseService<?> service, int pageNum, int pageSize) {
PageBean pageBean = service.getPageBean(pageNum, pageSize, this);
//ActionContext.getContext().getValueStack().push(pageBean);
return pageBean;
}
/**
* 根据hql信息,查询列表信息
*
* @param service
* @param pageNum
* @param pageSize
*/
public List prepareList(BaseService<?> service, int pageNum, int pageSize) {
List list = service.getEntity(pageNum, pageSize, this);
return list;
}
/**
* 根据hql信息的复合条件,查询单个的对象
*
*
*/
public <T>T prepareObject(BaseService<T> service) {
return service.getEntity(this.getListQueryHql(), this.getParameters());
}
2,分页依赖的类、方法(PageBean.java + BaseService.java)
BaseService.java中方法getPageBean()
----------------------------------------
注:这里的getSession()方法为获取当前可用session ------> sessionFactory.getCurrentSession();
/**
* @ClassName: BaseServiceImpl
* @Description: 抽象的service实现,专门用于继承
* @project: zoneSystem_v01
* @package: com.hl.zoneSystem_v01.service.impl
* @author: hl
* @version: V1.0
* @since: JDK 1.6.0_21
* @date: 2014-3-31 下午7:59:59
* @param <T>
*/
public abstract class BaseServiceImpl<T> implements BaseService<T> {
/** (not Javadoc)
* @Title: getPageBean
* @Description: 公共的查询分页信息的方法
* @param pageNum
* @param pageSize
* @param queryHelper
* @return
* @see com.hl.zoneSystem_v01.dao.BaseDao#getPageBean(int, int, com.hl.zoneSystem_v01.utils.QueryHelper)
*/
@Override
public PageBean getPageBean(int pageNum, int pageSize,QueryHelper queryHelper) {
//logger.debug("BaseDaoImpl.getPageBean( int pageNum, int pageSize, QueryHelper queryHelper )");
// 参数列表
List<Object> parameters = queryHelper.getParameters();
//logger.debug("queryHelper.getListQueryHql()----->"+queryHelper.getListQueryHql());
// 查询本页的数据列表 这里的getSession()为获取当前可用的session------>sessionFactory.getCurrentSession();
Query listQuery = getSession().createQuery(queryHelper.getListQueryHql()); // 创建查询对象
if (parameters != null) { // 设置参数
for (int i = 0; i < parameters.size(); i++) {
listQuery.setParameter(i, parameters.get(i));
}
}
listQuery.setFirstResult((pageNum - 1) * pageSize);
listQuery.setMaxResults(pageSize);
List list = listQuery.list(); // 执行查询
// 查询总记录数量
Query countQuery = getSession().createQuery(queryHelper.getCountQueryHql());
if (parameters != null) { // 设置参数
for (int i = 0; i < parameters.size(); i++) {
countQuery.setParameter(i, parameters.get(i));
}
}
Long count = (Long) countQuery.uniqueResult(); // 执行查询
return new PageBean(pageNum, pageSize, count.intValue(), list);
}
}
PageBean.java
-------------------------
/**
* 分页功能中的一页的信息
*
* @author hl
*
*/
public class PageBean {
// 指定的或是页面参数
private int currentPage; // 当前页
private int pageSize; // 每页显示多少条
// 查询数据库
private int recordCount; // 总记录数
private List recordList; // 本页的数据列表
// 计算
private int pageCount; // 总页数
private int beginPageIndex; // 页码列表的开始索引(包含)
private int endPageIndex; // 页码列表的结束索引(包含)
/**
* 只接受前4个必要的属性,会自动的计算出其他3个属生的值
*
* @param currentPage
* @param pageSize
* @param recordCount
* @param recordList
*/
public PageBean(int currentPage, int pageSize, int recordCount, List recordList) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.recordCount = recordCount;
this.recordList = recordList;
// 计算总页码
pageCount = (recordCount + pageSize - 1) / pageSize;
// 计算 beginPageIndex 和 endPageIndex
// >> 总页数不多于10页,则全部显示
if (pageCount <= 10) {
beginPageIndex = 1;
endPageIndex = pageCount;
}
// >> 总页数多于10页,则显示当前页附近的共10个页码
else {
// 当前页附近的共10个页码(前4个 + 当前页 + 后5个)
beginPageIndex = currentPage - 4;
endPageIndex = currentPage + 5;
// 当前面的页码不足4个时,则显示前10个页码
if (beginPageIndex < 1) {
beginPageIndex = 1;
endPageIndex = 10;
}
// 当后面的页码不足5个时,则显示后10个页码
if (endPageIndex > pageCount) {
endPageIndex = pageCount;
beginPageIndex = pageCount - 10 + 1;
}
}
}
public List getRecordList() {
return recordList;
}
public void setRecordList(List recordList) {
this.recordList = recordList;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public int getBeginPageIndex() {
return beginPageIndex;
}
public void setBeginPageIndex(int beginPageIndex) {
this.beginPageIndex = beginPageIndex;
}
public int getEndPageIndex() {
return endPageIndex;
}
public void setEndPageIndex(int endPageIndex) {
this.endPageIndex = endPageIndex;
}
}