hibernate实现分页查询
具体思路
通过Hibernate实现分页查询,
开发人员只需要提供HQL语句(调用Session的createQuery()方法)
或查询条件(调用Session的createCriteria()方法)、
设置查询起始行数(调用Query或Criteria接口的setFirstResult()方法)
和最大查询行数(调用Query或Criteria接口的setMaxResults()方法)
并调用Query或Criteria接口的list()方法,Hibernate会自动生成分页查询的SQL语句。
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 }
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 }
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)
);
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
root
root
10 //连接池大小
true
org.hibernate.dialect.MySQLDialect
thread
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 }
13 public class PaginationQuery {
14
15 public void paginationByCriteria(){
16 SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
17 Session session = sessionFactory.getCurrentSession();
18 Transaction tx=null;
19 try {
20 //do some work
21 tx=session.beginTransaction();
22 Page page = new Page();
23 /**
24 * 假设现在查询的是第一页,每页查询的最大记录数是3.
25 */
26 page.setCurrentPage(1);
27 page.setPerPageRows(3);
28 Criteria criteria = session.createCriteria(Employee.class);
29 Integer currentPage = page.getCurrentPage();//得到当前页
30 Integer perPageRows = page.getPerPageRows();//得到每页的记录数:
31 /**
32 * 在Page类中我已说明了:每页开始的索引数在hibernate中的计算公式是:(currentPage-1)*perPageRows
33 */
34 criteria.setFirstResult((currentPage-1)*perPageRows);
35 criteria.setMaxResults(perPageRows);
36 List employees = criteria.list();
37 for(Employee employee:employees){
38 System.out.println("*********************");
39 System.out.println("id="+employee.getId()+" firstName="+employee.getFirstName()+" lastName="+employee.getLastName());
40 }
41 tx.commit();
42
43 } catch (Exception e) {
44 if(tx!=null){
45 tx.rollback();
46 }
47 e.printStackTrace();
48 } finally {
49 session.close();//关闭流,一定要关闭,不然会影响运行速度。
50 }
51 }
52 public static void main(String[] args) {
53 PaginationQuery paginationQuery = new PaginationQuery();
54 paginationQuery.paginationByCriteria();
55 }
56 }