Hibernate实现分页查询

分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个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服务的,抓住这个就可以了。代码可以随便写。

原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/11287655.html

时间: 2024-10-02 22:12:47

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

hibernate 的分页查询

hibernate的分页查询有个好处,就是不用管数据库方言.比如db2的分页查询很麻烦,但是用hibernate的方式,就完全不用管这些了 /* 使用HQL分页查询Customer信息 */ public static List<Customer> listPageCustomer_HQL(int pageNo, int perPageNum) { Session session = HibernateUtils.getSession(); String hql = "from Cu

hibernate做分页查询

1.分页查询所需条件(当前页面数 初始化为1,每页显示的数据条数,最大页码数,数据总条数) 2.将所需数据传入后台(pageNum) 查询所有的数据条数(QBC查询) 根据条件查询显示的数据 3.最终显示结果

MyBatis使用(二)分页查询

由于MyBatis没有相关的分页查询,因此抽取出hibernate的分页查询功能,通过过滤器,对本地sql方言进行区分,对sql语句进行拼接和封装 步骤分为:1.先查询出总数   2.通过拼接的sql再去查询相关信息 /** * 带有分页信息的查询 * @param sqlMapId mybatis映射id * @param pageRequest 分页请求参数信息 * @return */ @SuppressWarnings({ "rawtypes", "unchecked

Hibernate分页查询小结

通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1.QBE(Qurey By Example)检索方式 QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用.一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象.QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配.在这种情况下,还是采用HQL检索方式或QBC检索方式. Java代码   /** * @function 根据传递过来的Object,

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

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

Hibernate支持类中的分页查询的实现

Hibernate支持类的实现 package com.myHibernateDao; import java.sql.SQLException; import java.util.List; import javax.annotation.Resource; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate

hibernate 中的query的分页查询

//方法描述:根据会员名称和页容量分页查询代理人 public List<HbUser> findUserByPage(int page,int pageSize, String userName)   throws Exception {  Session session = sessionFactory.getCurrentSession();  StringBuffer hql = new StringBuffer("from HbUser where isDelete = 0

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件. 分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select * from  [表名] where   [字段名]  like   ['%条件%']    limit  [开始查询的索引],[每页显示的数据] 带查询条件的分页分两步 (1)第一步:查询出符合条件的数据的总条数 ---->select count(*) from [表名] where  [字段

Java_Web三大框架之Hibernate+jsp+HQL分页查询

分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { private int id;//房屋id private HouseType type;//房屋类型 private Users2 user;//用户 private Street street;//街道 private String title;//标题 private String descr