hibernate分页查询

原创 2017年01月03日 13:20:26

一、准备工作

1.打开oracle数据库,登录scott账户,查询emp表的所有记录、总记录数

2.打开MyEclipse,创建一个Java项目:hibernate_page,创建包,添加oracle数据库连接,添加hibernate配置文件,添加scott账户emp,dept表的hibernate映射文件及映射类。

3.创建TestPage.java测试类,测试hibernate分页查询。

public class TestPage {

	public static void main(String[] args) {
//		t1();//通过分页类分页查询
		t2();//直接在hibernate中分页查询
	}
}
二、开始测试

(1)1.通过创建一个泛型类Pager<T>,这是分页的公共类

package com.svse;

import java.util.List;

/**
 * 新建一个泛型类Pager<T>,这是分页的公共类									<br/>
 * 
 * @author Administrator 
 * 	分页																		<br/>
 *  firstIndex 首记录索引 = (pageNo - 1) * pageSize 							<br/>
 *  pageNo 当前页号 															<br/>
 *  pageSize 页面大小														<br/>
 *  totalRecordCount 总记录数 = select count(*) from 表名						<br/>
 *  totalPageCount 总页数 = 													<br/>
 *         算法1: if( totalRecourdCount % pageSize == 0 ){ 					<br/>
 *         				totalPageCount = totalRecourdCount / pageSize; 		<br/>
 *         		  }else{ 													<br/>
 *         				totalPageCount = totalRecourdCount / pageSize + 1;  <br/>
 *         		  }															<br/>
 * 
 *         算法2: totalPageCount = (totalRecourdCount - 1) / pageSize + 1;	<br/>
 * @param <T>
 */
public class Pager<T> {

	private int firstIndex;// 首记录索引
	private int pageNo;// 当前页号
	private int pageSize;// 页面大小
	private int totalRecordCount;// 总记录数
	private int totalPageCount;// 总页数

	private List<T> list;// list容器,接收数据

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}

	/**
	 * firstIndex只要get方法,不要set方法
	 * 
	 * @return
	 */
	public int getFirstIndex() {
		// 首记录索引 = (当前页号 - 1)*页面大小
		return firstIndex = (this.getPageNo() - 1) * this.getPageSize();
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalRecordCount() {
		return totalRecordCount;
	}

	public void setTotalRecordCount(int totalRecordCount) {
		this.totalRecordCount = totalRecordCount;
	}

	/**
	 * totalPageCount只要get方法,不要set方法
	 * 
	 * @return
	 */
	public int getTotalPageCount() {
		// 总页数 = (总记录数 - 1)/页面大小 + 1
		return totalPageCount = (this.getTotalRecordCount() - 1)
				/ this.getPageSize() + 1;
	}

}
2.再到测试类TestPage的主方法中编写测试方法,并调用这个类,来实现分页查询

	/**
	 * 通过分页类分页查询
	 */
	private static void t1() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		//查询emp表的所有内容
		Query query = session.createQuery("FROM Emp");
		//将Emp填充到Pager<T>泛型类中
		Pager<Emp> pager = new Pager<Emp>();
		pager.setPageNo(2);//当前页号
		pager.setPageSize(5);//页面大小
		
		query.setFirstResult(pager.getFirstIndex());//获取首记录索引
		query.setMaxResults(pager.getPageSize());//获取页面大小
		
		List<Emp> list = query.list();
		for(Emp e : list){
			/*
			 * e.getDept()获得的是一个地址
			 * e.getDept().getDeptno()获得的才是真正的部门编号
			 * */
			System.out.println(e.getEmpno()+"\t\t"+e.getEname()+"\t\t"+e.getJob()+"\t\t"
					+e.getMgr()+"\t\t"+e.getHiredate()+"\t\t"
					+e.getSal()+"\t\t"+e.getComm()+"\t\t"+e.getDept().getDeptno());
		}
		
		
		
		transaction.commit();
		session.close();
		sessionFactory.close();
		
	}
首先是e.getDept(),获取部门


再将e.getDept()改为e.getDept().getDeptno().


(2)直接在hibernate中分页查询

	/**
	 * 直接在hibernate中分页查询
	 */
	private static void t2() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Query query = session.createQuery("FROM Emp");
		//查询emp表中的总记录数countHQL
		String countHQL = "SELECT count(*) FROM Emp";
		//计算总记录数count
		int count = ((Long) session.createQuery(countHQL).uniqueResult()).intValue();
		//设置页面大小pageSize
		int pageSize = 5;
		//计算总页数totalPageCount
		int totalPageCount = (count%pageSize == 0)?(count/pageSize):(count/pageSize + 1);
		//设置当前页码pageNo
		int pageNo = 1;
		
		query.setFirstResult((pageNo - 1)*pageSize);//获取首记录索引
		query.setMaxResults(pageSize);//获取页面大小
		
		
		List<Emp> list = query.list();
		for(Emp e : list){
			/*
			 * e.getDept()获得的是一个地址
			 * e.getDept().getDeptno()获得的才是真正的部门编号
			 * */
			System.out.println(e.getEmpno()+"\t\t"+e.getEname()+"\t\t"+e.getJob()+"\t\t"
					+e.getMgr()+"\t\t"+e.getHiredate()+"\t\t"
					+e.getSal()+"\t\t"+e.getComm()+"\t\t"+e.getDept().getDeptno());
		}
		
		
		
		transaction.commit();
		session.close();
		sessionFactory.close();
	}

运行结果为:


关键的地方在:

	query.setFirstResult((pageNo - 1)*pageSize);//获取首记录索引
	query.setMaxResults(pageSize);//获取页面大小
要记住这两个set方法。

好了,在hibernate中分页查询就完成了。^_^





版权声明:本文为博主原创文章,未经博主允许不得转载。

Hibernate第十篇【Hibernate查询详解、分页查询】

前言在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式….到目前为止,我们都是使用一些简单的主键查询阿…使用HQL查询所有的数据….本博文主要讲解Hibernate的查询操作...
  • hon_3y
  • hon_3y
  • 2017年05月08日 15:58
  • 3669

SSH分页(Hibernate实现简单分页查询)

直接正题 一、INewsDao.java(DAO接口):  1 package cn.dy.dao;  2   3 import java.util.List;  4 impor...
  • kalision
  • kalision
  • 2015年07月08日 13:19
  • 30499

(2)hibernate HQL命名查询和Query接口的分页查询

hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定:  Pre...
  • jianfpeng241241
  • jianfpeng241241
  • 2016年11月11日 00:35
  • 1282

Hibernate实现分页查询的原理分析

原文链接 Hibernate 可以实现分页查询,例如: 从第2万条开始取出100条记录 Java代码 收藏代码Query q = session.createQuery("from Cat a...
  • cztq15
  • cztq15
  • 2016年04月27日 21:21
  • 3726

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类。利用分页对象进行分页。 但,分页往往带查询条件。   分页类的三个重要数据:【当前页码数】,【数据库中的总记录数】,【每页显示的数据的条数】 原理:...
  • dbeautifulLife
  • dbeautifulLife
  • 2017年03月21日 17:13
  • 813

总结一些分页查询的方法SQL server,MySQL,oracle数据库及hibernate中

分页查询是数据库查询中经常用到的一项操作,对查询出来的结果进行分页查询可以方便浏览。那么Oracle、SQL Server、MySQL是如何实现查询的呢?本文我们就来介绍这一部分内容。以及hibe...
  • angus_737093684
  • angus_737093684
  • 2016年11月08日 08:29
  • 1082

Hibernate使用原生的动态sql实现带条件的查询分页功能

背景最近在做项目的时候需要使用到分页功能,项目用的框架是JPA,老实说SpringDataJpa的带条件的分页查询功能真的难用。。。所以想到用hibernate的动态SQL来实现算了。实现步骤1.在h...
  • qq32933432
  • qq32933432
  • 2016年06月21日 11:09
  • 5671

用hibernate实现动态查询+分页的模板,另附struts2的标签在分页中的使用

2
  • lixiao1048
  • lixiao1048
  • 2016年07月01日 19:18
  • 756

hibernate 分页查询的bug

环境 是 hibernate + oracle10g hibernate 分页查询 的第一页 和第二页之后的sql 不一样 第一页时是:  select * from (myquery) where ...
  • polohoho1
  • polohoho1
  • 2013年07月09日 18:02
  • 1661

springmvc4+spring4+hibernate4注解开发,分页查询,表头排序,多条件模糊查询,查询自动补全功能

一、数据库 create table if not exists t_student( student_id int primary key not null auto_increment, stu...
  • qq931399960
  • qq931399960
  • 2015年05月01日 23:22
  • 3065
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate分页查询
举报原因:
原因补充:

(最多只允许输入30个字)