分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解:

 1 package com.entity;
2 /**
3 * @author:秦林森
4 */
5
6 import javax.persistence.criteria.CriteriaBuilder;
7
8 public class Page {
9 /**
10 * 其中currentPage,perPageRows这两个参数是做分页查询必须具备的参数
11 * 原因是:hibernate中的Criteria或则是Query这两个接口:都有setFirstResult(Integer firstResult)
12 * 和setMaxResult(Integer maxResult),
13 * 这里的firstResult就是每页的开始的索引数:
14 * 每页开始的索引数的计算公式是:(currentPage-1)*perPageRows+1,(这是相对索引从1开始的)
15 * 但是Hibernate中的firstResult的索引是从0开始的,所以在hibernate中每页开始的索引数的计算公式是:
16 * (currentPage-1)*perPageRows+1-1=(currentPge-1)*perPageRows.
17 *
18 * maxResult就是每页能查询的最大记录数:也就是perPageRows.
19 *
20 * Math.ceil(totalRows/perPageRows)==totalPages;//这是根据总记录数和每页的记录数算出总页数的计算公式。
21 */
22 private Integer currentPage;//当前页
23 private Integer perPageRows;//每页的记录数
24 private Integer totalRows;//总记录数:
25 private Integer totalPages;//总页数:
26 public Integer getCurrentPage() {
27 return currentPage;
28 }
29
30 public void setCurrentPage(Integer currentPage) {
31 this.currentPage = currentPage;
32 }
33
34 public Integer getPerPageRows() {
35 return perPageRows;
36 }
37
38 public void setPerPageRows(Integer perPageRows) {
39 this.perPageRows = perPageRows;
40 }
41
42 public Integer getTotalRows() {
43 return totalRows;
44 }
45
46 public void setTotalRows(Integer totalRows) {
47 this.totalRows = totalRows;
48 }
49
50 public Integer getTotalPages() {
51 return totalPages;
52 }
53
54 public void setTotalPages(Integer totalPages) {
55 this.totalPages = totalPages;
56 }
57 }
 

下面用Hibernate的Criteira接口进行查询:

对应的实体类Employee的代码如下:

 
 1 package com.entity;
2
3 import javax.persistence.*;
4
5 @Entity
6 @Table(name = "EMPLOYEE")
7 public class Employee {
8 @Id
9 @GeneratedValue(strategy = GenerationType.IDENTITY)
10 private int id;
11 @Column(name = "first_name")
12 private String firstName;
13 @Column(name = "last_name")
14 private String lastName;
15 @Column(name = "salary")
16 private int salary;
17 //a constructor with no arguments
18
19
20 public Employee() {
21 }
22
23 public int getId() {
24 return id;
25 }
26
27 public void setId(int id) {
28 this.id = id;
29 }
30
31 public String getFirstName() {
32 return firstName;
33 }
34
35 public void setFirstName(String firstName) {
36 this.firstName = firstName;
37 }
38
39 public String getLastName() {
40 return lastName;
41 }
42
43 public void setLastName(String lastName) {
44 this.lastName = lastName;
45 }
46
47 public int getSalary() {
48 return salary;
49 }
50
51 public void setSalary(int salary) {
52 this.salary = salary;
53 }
54 }
 

//创建EMPLOYEE表的sql语句是:

create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);

首先在写一个配置文件:hibernate.cfg.xml用于连接数据库;

hibernate.cfg.xml的代码如下:

 
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-5.0.dtd"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">130850a,</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.current_session_context_class">thread</property> <mapping class="com.entity.Employee" /> </session-factory>
</hibernate-configuration>
 

在写一个用于启动Hibernate的util类:HibernateUtil的代码如下:

 1 package com.util;
2 import org.hibernate.SessionFactory;
3 import org.hibernate.boot.Metadata;
4 import org.hibernate.boot.MetadataSources;
5 import org.hibernate.boot.registry.StandardServiceRegistry;
6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
7 import org.hibernate.cfg.Configuration;
8 import org.hibernate.service.ServiceRegistry;
9 public class HibernateUtil {
10 private static final SessionFactory sessionFactory;
11
12 private static ServiceRegistry serviceRegistry;
13
14 static {
15 try {
16 StandardServiceRegistry standardRegistry =
17 new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
18 Metadata metaData =
19 new MetadataSources(standardRegistry).getMetadataBuilder().build();
20 sessionFactory = metaData.getSessionFactoryBuilder().build();
21 } catch (Throwable th) {
22
23 System.err.println("Enitial SessionFactory creation failed" + th);
24 throw new ExceptionInInitializerError(th);
25
26 }
27 }
28 public static SessionFactory getSessionFactory() {
29
30 return sessionFactory;
31
32 }
33 }
 

最后是分页查询的代码,代码如下:

package com.hibDemo;

import com.entity.Employee;
import com.entity.Page;
import com.util.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction; import java.util.List; public class PaginationQuery { public void paginationByCriteria(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx=null;
try {
//do some work
tx=session.beginTransaction();
Page page = new Page();
/**
* 假设现在查询的是第一页,每页查询的最大记录数是3.
*/
page.setCurrentPage(1);
page.setPerPageRows(3);
Criteria criteria = session.createCriteria(Employee.class);
Integer currentPage = page.getCurrentPage();//得到当前页
Integer perPageRows = page.getPerPageRows();//得到每页的记录数:
/**
* 在Page类中我已说明了:每页开始的索引数在hibernate中的计算公式是:(currentPage-1)*perPageRows
*/
criteria.setFirstResult((currentPage-1)*perPageRows);
criteria.setMaxResults(perPageRows);
List<Employee> employees = criteria.list();
for(Employee employee:employees){
System.out.println("*********************");
System.out.println("id="+employee.getId()+" firstName="+employee.getFirstName()+" lastName="+employee.getLastName());
}
tx.commit(); } catch (Exception e) {
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();//关闭流,一定要关闭,不然会影响运行速度。
}
}
public static void main(String[] args) {
PaginationQuery paginationQuery = new PaginationQuery();
paginationQuery.paginationByCriteria();
}
}

总结:这个Page类为Hibernate中setFirstResult,和setMaxResult服务的,抓住这个就可以了。代码可以随便写。

Hibernate实现分页查询的更多相关文章

  1. hibernate 的分页查询

    hibernate的分页查询有个好处,就是不用管数据库方言.比如db2的分页查询很麻烦,但是用hibernate的方式,就完全不用管这些了 /* 使用HQL分页查询Customer信息 */ publ ...

  2. Hibernate 条件-分页查询

    这里我们继续跟着上一次的节奏继续学习Hibernate的查询. 1.条件查询一(占位符) 按照占位符的方式进行条件查询,这里query有一个setInteger(arg1, arg2)方法,其中第一个 ...

  3. 用Hibernate实现分页查询

    分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: package com.entity; /** * @author:秦 ...

  4. hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句

    package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...

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

    前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式-.到目前为止,我们都是使用一些简单的主键查询阿-使用HQL查询所有的数据-.本博文主要讲解Hibernate的查询操 ...

  6. 用Hibernate和Struts2+jsp实现分页查询、修改删除

    1.首先用get的方法传递一个页数过去 2.通过Struts2跳转到Action 3.通过request接受主页面index传过的页数,此时页数是1, 然后调用service层的方法获取DAO层分页查 ...

  7. 【java】spring-data-jpa 集成hibernate实现多条件分页查询

    初次接触spring-data-jpa,实现多条件分页查询. 基础环境 Spring Boot+spring-data-jpa+hibernate+mysql 1.接口 要继承这个接口,这个接口提供了 ...

  8. [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Hibernate分页查询小结

    通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1.QBE(Qurey By Example)检索方式 QBE 是最简单的,但是功能也是最弱的,QBE的功能不是特别强大, ...

随机推荐

  1. 吴裕雄--天生自然 JAVASCRIPT开发学习:while 循环

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 使用js检测页面是在electron app中运行还是在浏览器中运行

    <script type="text/javascript"> var userAgent = navigator.userAgent.toLowerCase() ){ ...

  3. 高性能集群软件keepalived

     Keepalived介绍 以下是keepalive官网上的介绍.官方站点为http://www.keepalived.org.         Keepalived is a routing sof ...

  4. maven中的groupId和artifactId 区分

    原文地址:https://blog.csdn.net/snowin1994/article/details/53024871/ maven中的groupId和artifactId 区分 groupid ...

  5. ES6 之 Math对象的扩展

    1.ES5 http://www.w3school.com.cn/jsref/jsref_obj_math.asp 2.ES6 Math.trunc() - 取整,去掉一个数的小数部分 console ...

  6. 38. docker cloud 简介及 关联 git hub

    1.概念 提供 容器的管理, 编排, 部署 的托管服务 2.功能 image 管理 创建 stack 创建服务 service 添加 节点 作为 docker host 自动关联云服务商 AWS  A ...

  7. TCP/IP通信过程

    一.参考网址 1.以太网帧格式.IP数据报格式.TCP段格式+UDP段格式 详解 2. 二.TCP的建立过程 1.例子: 192.168.22.66 telenet到192.168.22.74的tcp ...

  8. modbus 指令16 $10 的格式

    { //写多个请求 01(从设备)10(功能码) 00 77(起始地址) 00 01(寄存器数) 02(字节数) 05 55(写的数据) 6F B8(CRC) //写多个返回 01(从设备) 10(功 ...

  9. Creo 2.0 Toolkit 解锁的问题

    近期开发Creo Toolkit遇到一个问题,在自己本机开发完成后运行并无问题,但是如果拿去给别人的机子运行会报出 提示“creo ToolKit应用程序在分配到您的地址之前未被解锁”,在与PTC 技 ...

  10. 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作

    spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...