`
Kenny.Lee
  • 浏览: 514920 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DetachedCriteria查询、分页类&整合struts标记制作分页按钮

阅读更多
花了两天时间才整理好的分页类,共享一下。

说明:该方法是参考了一下网上广为流传的DetachedCriteria查询方法后改进而来的。按照自己觉得满意的方法去修改了一下。并且配合struts1.2的标记配合使用,其实应该直接封装成自己分页标记的,或者使用JavaScript生成,但先这样吧,当作学习struts的标记库使用。

按钮的效果可以简单的做到附件图片上的效果





虽然不敢说完美的分页按钮,但比较满意的效果了。

------------------------------------

分页Bean类:

import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
/**
 * 分页常用的bean类。<br>
 * 里面包含搜索返回的List,查询条件DetachedCriteria及分页菜单用到的数据等。
 * 
 * @author KennyLee E-mail:kennylee26@gmail.com 2008-10-25
 */
public class KPaginationSupport implements Cloneable {
	// Default page size
	public static final int PAGESIZE = 20;
	public static final int MENU_SIZE = 7;
	// total Rows
	private int totalRowsAmount;
	private int pageSize = PAGESIZE;
	private int totalPages;
	// current page number
	private int currentPage = 1;
	// next page number
	private int nextPage;
	// previous page number
	private int previousPage;
	// is has next page
	private boolean hasNext;
	// is has previous page
	private boolean hasPrevious;
	// current page start row number
	private int pageStartRow = 0;
	// current page end row number
	private int pageEndRow;
	private String[] pageMenuNum;
	private int menuSize = MENU_SIZE;
	// Pagination values
	private List items;
	// select detachedCriteria
	private DetachedCriteria detachedCriteria;
	public KPaginationSupport() {
	}
	public String[] getPageMenuNum() {
		return pageMenuNum;
	}
	public void setPageMenuNum(String[] pageMenuNum) {
		this.pageMenuNum = pageMenuNum;
	}
	public DetachedCriteria getDetachedCriteria() {
		return detachedCriteria;
	}
	public void setDetachedCriteria(DetachedCriteria detachedCriteria) {
		this.detachedCriteria = detachedCriteria;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public void setTotalPages(int totalPages) {
		this.totalPages = totalPages;
	}
	public void setNextPage(int nextPage) {
		this.nextPage = nextPage;
	}
	public void setPreviousPage(int previousPage) {
		this.previousPage = previousPage;
	}
	public void setHasNext(boolean hasNext) {
		this.hasNext = hasNext;
	}
	public void setHasPrevious(boolean hasPrevious) {
		this.hasPrevious = hasPrevious;
	}
	public void setPageStartRow(int pageStartRow) {
		this.pageStartRow = pageStartRow;
	}
	public List getItems() {
		return items;
	}
	public void setItems(List items) {
		this.items = items;
	}
	public void setPageEndRow(int pageEndRow) {
		this.pageEndRow = pageEndRow;
	}
	/**
	 * 构造函数。
	 * 
	 * @param totalRows
	 *            总行数
	 * @param currentPage
	 *            当前页数
	 */
	public KPaginationSupport(int totalRows, int currentPage) {
		setPaginationSupport(totalRows, currentPage);
	}
	/**
	 * 构造函数。
	 * 
	 * @param totalRows
	 *            总行数
	 * @param currentPage
	 *            当前页数
	 * @param pageSize
	 *            每页显示数量。
	 */
	public KPaginationSupport(int totalRows, int currentPage, int pageSize) {
		this.pageSize = pageSize;
		this.setPaginationSupport(totalRows, currentPage);
		String[] pageNums = getPageMenuNums(currentPage);
		this.setPageMenuNum(pageNums);
	}
	public void setPaginationSupport(int totalRows, int currentPage) {
		// 获取总页码,通过对象总数还是每页多少行的关系
		setTotalRowsAmount(totalRows);
		setCurrentPage(currentPage);
	}
	public KPaginationSupport(List items, int totalCount) {
		setPageSize(PAGESIZE);
		setItems(items);
		int currentPage = 1;
		this.setPaginationSupport(totalCount, currentPage);
	}
	public KPaginationSupport(List items, int totalCount, int startIndex) {
		setPageSize(PAGESIZE);
		setItems(items);
		int currentPage = (startIndex / pageSize) + 1;
		this.setPaginationSupport(totalCount, currentPage);
	}
	/**
	 * @param items
	 *            保存的目标List
	 * @param totalCount
	 *            查找的总行数
	 * @param pageSize
	 *            每页显示的行数
	 * @param startIndex
	 *            第几行开始
	 * 
	 */
	public KPaginationSupport(List items, int totalCount, int pageSize,
			int startIndex) {
		setPageSize(pageSize);
		setItems(items);
		int currentPage = (startIndex / pageSize) + 1;
		this.setPaginationSupport(totalCount, currentPage);
	}
	/**
	 * 
	 * 构造PS时的初始化方法。
	 * 
	 * @param items
	 *            保存的目标List
	 * @param totalCount
	 *            查找的总行数
	 * @param pageSize
	 *            每页显示的行数
	 * @param startIndex
	 *            第几行开始
	 * 
	 */
	public KPaginationSupport(List items, int totalCount, int pageSize,
			int startIndex, DetachedCriteria detachedCriteria) {
		setPageSize(pageSize);
		setItems(items);
		int currentPage = (startIndex / pageSize) + 1;
		this.setPaginationSupport(totalCount, currentPage);
		setDetachedCriteria(detachedCriteria);
		String[] pageNums = getPageMenuNums(currentPage);
		this.setPageMenuNum(pageNums);
	}
	/**
	 * 分页导航按钮
	 * 
	 * @param currentPage
	 * @return
	 */
	private String[] getPageMenuNums(int currentPage) {
		String[] pageNums = null;
		if (totalPages > menuSize) {// 总页数大于导航显示的页数
			pageNums = new String[menuSize];
			int lastMenuNum = totalPages - menuSize + 1;// 最后一列导航栏按钮
			int beginMumNum = menuSize;
			int x = menuSize - 1;// 导航显示系数
			if ((currentPage < lastMenuNum) && (currentPage > beginMumNum)) {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(currentPage + i - x / 2);
				}
			} else if (currentPage > lastMenuNum) {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(lastMenuNum + i);
				}
			} else if (currentPage == lastMenuNum) {
				if ((lastMenuNum - x / 2) < 1) {
					lastMenuNum = x / 2 + 1;
				}
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(lastMenuNum + i - x / 2);
				}
			} else if (currentPage == beginMumNum) {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(1 + i + x / 2);
				}
			} else {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(1 + i);
				}
			}
		} else {// 总页数小于等于导航显示的页数,直接显示。
			pageNums = new String[totalPages];
			// 分页数比总页数少
			for (int i = 0; i < totalPages; i++) {
				pageNums[i] = String.valueOf(i + 1);
			}
		}
		return pageNums;
	}
	/**
	 * 设置总行数。
	 * 
	 * @param rows
	 *            总行数。
	 */
	private void setTotalRowsAmount(int rows) {
		if (rows < 0) {
			totalRowsAmount = 0;
		} else {
			totalRowsAmount = rows;
		}
		if (totalRowsAmount % pageSize == 0) {
			totalPages = totalRowsAmount / pageSize;
		} else {
			totalPages = totalRowsAmount / pageSize + 1;
		}
	}
	/**
	 *设置当前页数。
	 * 
	 * @param curPage
	 */
	private void setCurrentPage(int curPage) {
		if (curPage <= 0) {
			currentPage = 1;
		} else if (curPage > totalPages) {
			currentPage = totalPages;
		} else {
			currentPage = curPage;
		}
		if (currentPage == 1) {
			hasPrevious = false;
		} else {
			hasPrevious = true;
		}
		if (currentPage == totalPages) {
			hasNext = false;
		} else {
			hasNext = true;
		}
		nextPage = currentPage + 1;
		previousPage = currentPage - 1;
		// 计算当前页开始行和结束行
		pageStartRow = (currentPage - 1) * pageSize + 1;
		// pageStartRow = (currentPage - 1) * pageSize;
		// 记录索引从0开始
		pageStartRow -= 1;
		pageEndRow = pageStartRow + pageSize;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public boolean isHasNext() {
		return hasNext;
	}
	public boolean isHasPrevious() {
		return hasPrevious;
	}
	public int getNextPage() {
		return nextPage;
	}
	public int getPageSize() {
		return pageSize;
	}
	public int getPreviousPage() {
		return previousPage;
	}
	public int getTotalPages() {
		return totalPages;
	}
	public int getTotalRowsAmount() {
		return totalRowsAmount;
	}
	public int getPageStartRow() {
		return pageStartRow;
	}
	public int getPageEndRow() {
		return pageEndRow;
	}
	public String description() {
		String description = "Total:" + this.getTotalRowsAmount() + " items "
				+ this.getTotalPages() + " pages,Current page:"
				+ this.currentPage + " Previous " + this.hasPrevious + " Next:"
				+ this.hasNext + " start row:" + this.pageStartRow
				+ " end row:" + this.pageEndRow;
		return description;
	}
	public void init() {
		// do some initialization work
	}
	@Override
	public KPaginationSupport clone() throws CloneNotSupportedException {
		return (KPaginationSupport) super.clone();
	}
	public int getMenuSize() {
		return menuSize;
	}
	public void setMenuSize(int menuSize) {
		this.menuSize = menuSize;
	}
}


----------------------

DAO层,其实不需要局限用Criteria查询的。查询好需要的数据后,构造bean类,如下。

   1.                         PaginationSupport ps = new PaginationSupport(items,
   2.                                 totalCount, pageSize, startIndex,
   3.                                 detachedCriteria);

附上完整的DetachedCriteria查询方法供参考。在网上找到的,然后参考改进了一下,因为找到的都存在BUG,下面是修正后的版本。测试,并且正常使用中。

    /**
      * @param detachedCriteria
      * @param pageSize
      * @param startIndex
      */
     public PaginationSupport findPageByCriteria(
             final DetachedCriteria detachedCriteria, final int pageSize,
             final int startIndex) {
         
         log.info("in findByPage...");
         
         return (PaginationSupport) getHibernateTemplate().execute(
                 new HibernateCallback() {
                   public Object doInHibernate(Session session)
                             throws HibernateException {
                         Criteria criteria = detachedCriteria
                                 .getExecutableCriteria(session);
                         CriteriaImpl impl = (CriteriaImpl) criteria;
                         // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作
                         Projection projection = impl.getProjection();
                         int totalCount = ((Integer) criteria.setProjection(
                                 Projections.rowCount()).uniqueResult())
                                 .intValue();
                         log.info("totalCount:" + totalCount);
                         // 将之前的Projection和OrderBy条件重新设回去
                         criteria.setProjection(projection);
                         if (projection == null) {
                             criteria
                                     .setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                         }
                         List items = criteria.setFirstResult(startIndex)
                                 .setMaxResults(pageSize).list();
                         PaginationSupport ps = new PaginationSupport(items,
                                 totalCount, pageSize, startIndex,
                                 detachedCriteria);
                         // Set default status
                         criteria.setFirstResult(0).setMaxResults(totalCount);
                         return ps;
                     }
                 });
     }


----------------------

view层使用struts标签,代码有点长,供参考。注意css效果。
注意,action的方法其实需要两个即可,一个是第一次搜索的时候查询方法。另外一个是跳转到任何一页的方法。就算向前向后这样的方法其实并不需要。

                                <!-- pagination menu begin by KennyLee 2008-9-16 -->
                               <logic:present name="pageController" scope="request">
                                   <tr>
                                        <td colspan="6">
                                            <div id="pagination_info">
                                                [共${pageController.totalRowsAmount} 个账号] ${pageController.currentPage}/${pageController.totalPages}页(每页显示${pageController.pageSize})
                                           </div>
                                            <div class="pagination">
                                                <logic:equal value="true" name="pageController"
                                                   property="hasPrevious">
                                                  <html:link action="/mailbox/controller/list/pre"
                                                       paramId="toPageGo" paramName="pageController"
                                                       paramProperty="previousPage"><Perv</html:link>
                                               </logic:equal>
                                               <logic:notEqual value="true" name="pageController"
                                                   property="hasPrevious">
                                                   <span class="disabled"><Perv</span>
                                               </logic:notEqual>
                                               <logic:iterate id="num" name="pageController"
                                                   property="pageMenuNum" indexId="index">
                                                   <logic:equal value="0" name="index">
                                                       <logic:equal value="2" name="num">
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=1">1</html:link>
                                                       </logic:equal>
                                                       <logic:greaterThan value="2" name="num">
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=1">1</html:link>
                                                           <span>...</span>
                                                       </logic:greaterThan>
                                                   </logic:equal>
                                                   <logic:equal value="${num}" property="currentPage"
                                                       name="pageController">
                                                       <span class="current">${pageController.currentPage}</span>
                                                   </logic:equal>
                                                   <logic:notEqual value="${num}" property="currentPage"
                                                       name="pageController">
                                                       <html:link
                                                           page="/mailbox/controller/list/current.jspx?toPageGo=${num}">${num}</html:link>
                                                   </logic:notEqual>
                                                   <logic:equal value="${pageController.menuSize-1}"
                                                       name="index">
                                                       <logic:equal value="${pageController.totalPages-1}"
                                                           name="num">
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=${pageController.totalPages}">${pageController.totalPages}</html:link>
                                                       </logic:equal>
                                                       <logic:lessThan value="${pageController.totalPages-1}"
                                                           name="num">
                                                           <span>...</span>
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=${pageController.totalPages}">${pageController.totalPages}</html:link>
                                                       </logic:lessThan>
                                                   </logic:equal>
                                               </logic:iterate>
                                               <logic:equal value="true" name="pageController"
                                                   property="hasNext">
                                                   <html:link action="/mailbox/controller/list/next"
                                                       paramId="toPageGo" paramName="pageController"
                                                       paramProperty="nextPage">Next></html:link>
                                               </logic:equal>
                                               <logic:notEqual value="true" name="pageController"
                                                   property="hasNext">
                                                   <span class="disabled">Next></span>
                                               </logic:notEqual>
                                           </div>
                                       </td>
                                   </tr>
                               </logic:present>
                             <!-- pagination menu end -->
  • 大小: 5.1 KB
分享到:
评论

相关推荐

    DetachedCriteria查询

    DetachedCriteria 查询 DetachedCriteria 是 Hibernate 中的一种离线查询对象,它可以在不依赖 Session 的情况下生成动态 SQL 语句并进行查询。下面是 DetachedCriteria 查询的详细知识点: 创建 DetachedCriteria...

    struts2+spring+hibernate分页查询

    综上所述,Struts2、Spring和Hibernate的整合使得开发者能够便捷地实现分页查询,从而优化Web应用的性能和用户体验。在实际项目中,需要根据具体需求和业务场景,选择合适的分页策略和实现方式,同时注意性能优化和...

    Hibernate 使用DetachedCriteria操作

    - 在服务层进行分页查询时,可以先创建DetachedCriteria,然后在视图层根据请求参数调整限制条件,避免重复计算。 **4. DetachedCriteria 的基本用法** 创建DetachedCriteria通常从`DetachedCriteria.forClass()`...

    sh分页,增删改查

    **Struts分页** 在Struts中,实现分页通常通过Action类和自定义拦截器完成。Action类接收请求并调用业务逻辑,返回相应的结果页面。分页参数(如当前页数、每页条数)可以封装在ActionForm或者Action支持类...

    springMVC+hibernate的条件查询加分页的demo

    例如,我们可以使用DetachedCriteria对象来创建一个基本的查询,然后根据需要添加限制条件(Restrictions)、排序(Order)等。 分页功能在大数据量的查询中尤为重要,因为它可以避免一次性加载过多数据导致性能...

    DetachedCriteria笔记

    DetachedCriteria

    Hibernate - DetachedCriteria 的完整用法

    使用 DetachedCriteria 可以很方便地根据查询条件来返回查询结果,Spring 框架提供了 `getHibernateTemplate().findByCriteria(detachedCriteria)` 方法来实现这一点。 Criteria 和 DetachedCriteria 均可使用 ...

    DetachedCriteria使用介绍

    `DetachedCriteria` 是 Hibernate 提供的一种灵活且强大的查询机制,它允许你在脱离 Session 的情况下构建复杂的查询标准,这意味着你可以提前构建查询标准,然后在任何地方执行查询,而无需关心当前是否有 Session...

    Hibernate+sqlserver2000分页

    要将两者结合起来,我们可以创建一个自定义的SQL查询,并在Hibernate的`DetachedCriteria`中使用。这通常涉及到在HQL中嵌入SQL片段,或者使用`createSQLQuery`方法直接执行SQL查询。同时,别忘了映射查询结果到对应...

    Hibernate 在查询操作中要使用分页+命名参数+排序技术

    在IT行业中,数据库查询是日常开发中的重要环节,特别是在大型应用中,为了提高用户体验和系统性能,分页、命名参数和排序技术的应用至关重要。本文将深入探讨如何在使用Hibernate框架时,有效地结合这些技术进行...

    Hibernate(24): 为什么用DetachedCriteria不能表连接地取数据?

    在Java的持久化框架Hibernate中,DetachedCriteria是一个强大的查询工具,它允许我们在不与Session交互的情况下构建查询条件。然而,DetachedCriteria在处理复杂的关联查询,尤其是涉及到表连接(JOIN)时,可能存在...

    DetachedCriteria Criteria 使用方法

    假设我们要查询 `User` 表格中的所有资料,可以使用以下方式创建 `DetachedCriteria` 并执行查询: ```java // 创建 DetachedCriteria DetachedCriteria criteria = DetachedCriteria.forClass(User.class); // ...

    浅谈DetachedCriteria和Criteria的使用方法(必看)

    Restrictions是产生查询条件的工具类,提供了多种查询运算符,例如等于、不等于、大于、小于、like等。Restrictions可以用来构造查询条件,例如Restrictions.eq()等于、Restrictions.ne()不等于、Restrictions.gt()...

    我的处女作,整合SSH多数据源(添加、查询)

    源文件 博文链接:https://kings008.iteye.com/blog/246773

    留言板代码定义.pdf

    在`list()`方法中,`DetachedCriteria.forClass(Leave.class)`创建了一个针对`Leave`类的查询,`criteria.addOrder(Order.desc("regtime"))`设置了按“regtime”字段降序排列。 6. **Pagination(分页)**: 代码...

    QBC的各种查询

    QBC通过Criteria接口和DetachedCriteria类来构建查询。Criteria接口提供了多种方法,如add()用于添加查询条件,setFirstResult()和setMaxResults()用于分页,createAlias()用于关联查询等。DetachedCriteria则允许...

    Hibernate 查询经典练习题

    Criteria API提供了更面向对象的查询方式,通过`DetachedCriteria`构建查询条件,然后通过`session.createCriteria()`执行查询。 ### 练习题二:查询特定时间段内入职的员工 #### SQL查询 ```sql SELECT d.ename ...

    hibernate查询详解

    本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询DetachedCriteria、例子查询、SQL查询以及命名查询,以满足不同场景下的需求。 1. HQL查询: Hibernate Query Language(HQL)是一种...

    hibernate里面的 两种查询

    Order类用于排序,而Criteria还支持分页查询,通过setFirstResult()和setMaxResults()设置。 2. HQL(Hibernate Query Language): HQL是Hibernate特有的查询语言,它的语法类似于SQL,但面向对象,可以直接操作...

    Hibernate中查询的法方

    为了解决这个问题,可以在`DetachedCriteria`中设置相应的查询条件,以实现带条件的分页查询。 通过理解和熟练运用这些基本查询方法,你可以有效地利用Hibernate进行数据操作,从而提高开发效率。在实际项目中,还...

Global site tag (gtag.js) - Google Analytics