`

Hibernate 分页的实现方法 ---- 2016-03-08

阅读更多

1.  分页的基础代码,其中我们最需要的就是设置开始和结束的index。

 

	public List<T> queryByPage(String hql, int beginIndex, int pageSize) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		
			Query query = session.createQuery(hql);
			query.setFirstResult(beginIndex);
			query.setMaxResults(pageSize);
			List<T> list = query.list();
			return list;

	}

 

 

开始结束的index也不能直接写,因为可能越界了。所以一般在编写分页显示页面信息的时候,我们需要知道的信息包括最基本的pageNumber、pageSize、totalRecordAcount,这样就可以计算出正确的开始结束index。还有为了显示与隐藏“下一页”和“上一页”按钮的两个boolean值hasNextPage与hasPreviousPage。当然,为了更好的显示,你可能还需要其他的一些信息。这时我们就可以把这些信息统一写到一个PageInfo类中方便统一的管理,代码如下:

 

public class PageInfo {
	private int totalRow;	//总共记录数
	private int totalPage;	//总共页数
	private int currentPage = 1; //当前页,默认为1
	private int pageSize = 20;   //页的大小
	private boolean hasPrevious;
	private boolean hasNext;
	private boolean bof;
	private boolean eof;
    /*
	 * 构造方法
	   @param totalRow 总记录数
	   @param pageSize 页的大小
	   @param page 页码
     */
	public PageInfo(int totalRow, int pageSize, int page) {
		this.totalRow = totalRow;
		this.pageSize = pageSize;
		// 根据页大小和总记录数计算出总页数
		this.totalPage = countTotalPage(this.pageSize, this.totalRow);

		
		// 修正当前页
		setCurrentPage(page);
		init();
	}
	public int getTotalPage() {
		return totalPage;
	}
	public int getCurrentPage() {

		return this.currentPage;
	}
	// 修正计算当前页
	public void setCurrentPage(int currentPage) {
        if(currentPage>this.totalPage){
        	this.currentPage=this.totalPage;        	
        }else if (currentPage<1){
        	this.currentPage=1;
        }
        else{
        	this.currentPage=currentPage;
        }
	}
	// 获取分页大小

	public int getPageSize() {
		return pageSize;
	}

	// 设置分页大小
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	// 获取当前页记录的开始索引
	public int getBeginIndex() {
		int beginIndex = (currentPage - 1) * pageSize; // 索引下标从0开始
		return beginIndex;
	}
	// 计算总页数
	public int countTotalPage(int pageSize, int totalRow) {
		int totalPage = totalRow % pageSize == 0 ? totalRow / pageSize : totalRow / pageSize + 1;
		return totalPage;

	}
	// 返回下一页的页码
	public int getNextPage() {

		if (currentPage + 1 >= this.totalPage) { // 如果当前页已经是最后页 则返回最大页
			return this.totalPage;
		}
		
		return currentPage + 1; 
	}
	// 返回前一页的页码

	public int getPreviousPage() {
		if (currentPage - 1 <= 1) {

			return 1;

		} else {
			return currentPage - 1;
		}

	}
	public boolean isHasPrevious() {
		return hasPrevious;
	}
	public boolean isHasNext() {
		return hasNext;
	}
	public boolean isBof() {
		return bof;

	}
	public boolean isEof() {

		return eof;

	}
	public boolean hasNext() {

		return currentPage < this.totalPage;

	}
	public boolean hasPrevious() {

		return currentPage > 1;

	}
	public boolean isFirst() {

		return currentPage == 1;

	}
	public boolean isLast() {

		return currentPage >= this.totalPage;

	}
	// 初始化信息

	private void init() {

		this.hasNext = hasNext();

		this.hasPrevious = hasPrevious();

		this.bof = isFirst();

		this.eof = isLast();

	}
}

初始化的时候只需要三个输入,int totalRow, int pageSize, int page,然后其他的值都直接通过计算得到。

 

2. 为了方便存储查询得到的信息,我们可以再设置一个类PageResultSet来存储pageInfo实例和resultList。代码如下:

import java.util.List;
/**
 *该类描述了一个分页数据集 list中是查询的数据集合 ,pageInfo则描述了附加的页相关的信息
*/
public class PageResultSet<T> {

	private List<T> list;  //当前页的数据信息
	private PageInfo pageInfo; //当前页的信息
	public List<T> getList() {
		return list;
	}
	public void setList(List<T> list) {
		this.list = list;
	}

	public PageInfo getPageInfo() {
		return pageInfo;
	}
	public void setPageInfo(PageInfo pageInfo) {
		this.pageInfo = pageInfo;
	}
}

 3. 之后便可以利用上面的两个类来方便的查询分页信息了。

实例代码:

		public PageResultSet<BookInfo> queryByPage(String hql,int pageSize, int page) {

			

	 				


			int totalRow = bookInfoDao.queryRowCount(hql); // 计算总记录个数

			PageInfo pageinfo = new PageInfo(totalRow, pageSize, page);

			

			//获取该页的记录

			List<BookInfo> list = bookInfoDao.queryByPage(hql, pageinfo.getBeginIndex(), pageinfo.getPageSize()); 

		

			PageResultSet<BookInfo> pageResultSet = new PageResultSet<BookInfo>();

			pageResultSet.setList(list);
			System.out.println(totalRow);

			pageResultSet.setPageInfo(pageinfo);

			return pageResultSet;

		}

 

 

 

分享到:
评论

相关推荐

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...

    Struts + Hibernate 分页实现

    在"Struts + Hibernate 分页实现"这个项目中,重点在于如何在Web应用中整合这两个框架,并实现数据的分页显示。分页是大型数据集处理时常见的需求,它能够帮助用户更有效地浏览和管理大量信息,避免一次性加载所有...

    用户Hibernate实现的一个分页

    一、Hibernate分页基础 1. Hibernate的Query和Criteria API都提供了分页功能。使用`setFirstResult()`方法设置查询开始的位置,即第几条记录,以及`setMaxResults()`方法设置一次返回的最大记录数,这两者结合即可...

    完整Struts2 HIBERNATE实现分页

    根据提供的标题、描述以及部分内文,我们可以梳理出关于如何使用Struts2与Hibernate实现分页功能的关键知识点。 ### Struts2与Hibernate简介 - **Struts2**:这是一个基于MVC架构的开源Web框架,它能帮助开发者...

    spring-boot基于hibernate实现简单分页

    在本文中,我们将深入探讨如何使用Spring Boot与Hibernate框架实现简单的分页功能。Spring Boot以其简洁的配置和快速的应用开发而受到广泛欢迎,而Hibernate作为Java领域中的一个强大的ORM(对象关系映射)工具,...

    用Hibernate实现分页查询.docx

    - Hibernate中的`Criteria`和`Query`接口都提供了`setFirstResult`和`setMaxResult`方法来实现分页。其中`setFirstResult`设置的是查询结果中的第一个记录的索引位置,索引从0开始。 - 比如,如果当前页为2,每页...

    Struts+Hibernate实现分页

    这样的分页实现保证了数据的高效加载和用户的流畅体验,同时充分利用了Struts的控制层和Hibernate的数据访问层能力,降低了开发复杂度。在实际项目中,还可以考虑优化如缓存、懒加载等策略来进一步提高性能。

    分页Hibernate-mysql-jsp.rar

    在分页实现中,MySQL的SQL语句支持LIMIT和OFFSET关键字,这正是我们控制返回结果数量和跳过特定数量记录的关键。例如,我们可以使用`SELECT * FROM table LIMIT pageSize OFFSET (pageNumber - 1) * pageSize`来获取...

    Hibernate分页查询原理解读

    #### 三、Hibernate分页查询实现原理 ##### 3.1 使用SQL LIMIT实现分页 对于支持LIMIT关键字的数据库(例如MySQL),Hibernate会通过特定的方言(Dialect)来生成包含LIMIT关键字的SQL语句。具体实现如下: ```...

    hibernate-distribution-3.5.0-Final-dist文档

    1. **对象关系映射(ORM)**: Hibernate通过映射Java类到数据库表,将对象的实例与数据库记录关联起来,实现了对象层和数据层的解耦。 2. **Entity**: Hibernate中的实体代表数据库中的表,它们通常是Java类,通过...

    hibernate-release-5.3.2.Final

    总结,Hibernate ORM 5.3.2.Final版本是Java开发者实现高效数据库操作的强大工具,其丰富的特性和优化,使得开发者能更加专注于业务逻辑,而非底层数据库操作。正确理解和运用Hibernate,将极大地提升开发效率和软件...

    hibernate分页Hibernate 分页的设计和编码

    标题与描述均提到了“Hibernate分页的设计和编码”,这表明文章主要聚焦于如何在Hibernate框架中实现数据分页功能。下面将详细解析这一主题的关键知识点。 ### Hibernate分页概念 Hibernate是Java环境下一个开放源...

    hibernate实现分页

    ### Hibernate分页基础 1. **Criteria API**:Hibernate的Criteria API允许我们创建动态查询,同时也支持分页。通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria ...

    hibernate 通用分页的实现

    hibernate_mysql_struts2 实现的通用分页类.欢迎指正

    在JDBC,hibernate中实现分页

    #### Hibernate中的分页实现 在Hibernate框架中实现分页功能相对较为简单。通过`Query`对象提供的方法即可轻松完成。 ##### 示例代码解析 ```java Query query = session.createQuery("from Student"); query....

    最新 hibernate-release-4.2.13.Final.tgz

    这些示例涵盖了从基本的实体定义、配置,到复杂的查询、关联映射,通过实际操作,你可以深入理解Hibernate的工作原理和使用方法。 1. 实体管理:了解如何定义实体类,以及如何使用注解进行元数据配置。 2. 数据库...

    java+hibernate实现分页

    java+hibernate实现分页 public String execute() throws Exception { System.out.println("Page:" + page); pagePlanList = ps.findPlantByPage(page, rowsPerPage); totalPage = ps.getPlanTotalPage...

    struts2+spring+hibernate分页显示完整代码

    本篇文章将详细讲解如何在基于Struts2、Spring和Hibernate的项目中实现分页功能。 首先,我们从DAO层开始。在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两...

    strut2.0 + hibernate3.0 + jquery.datatables+mysql 5.0实现的 hibernate分页

    hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...

Global site tag (gtag.js) - Google Analytics