Code ví dụ Hibernate Pagination, phân trang trong hibernate

Code ví dụ Hibernate Pagination, phân trang trong hibernate.

Ở bài này mình sẽ giới thiệu một số cách truy vấn kết quả theo trang trong hibernate

Các cách phân trang với hibernate

Cách 1: Phân trang với setFirstResult, setMaxResults API

public List<Customer> getUsingSession(int position, int pageSize) {
  Session session = sessionFactory.openSession();
  Query query = session.createQuery("FROM Customer");
  query.setFirstResult(position);
  query.setMaxResults(pageSize);
  return query.list();
}

Cách 2: Phân trang với ScrollableResults API

public List<Customer> getUsingScroll(int position, int pageSize) {
  Session session = sessionFactory.openSession();
  Query query = session.createQuery("FROM Customer");
   
  ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY);
  resultScroll.setRowNumber(position);
  resultScroll.scroll(0);
  List<Customer> listCustomer = new ArrayList<Customer>();
  int i = 0;
  while (pageSize > i) {
    listCustomer.add((Customer) resultScroll.get(0));
      if (!resultScroll.next()) {
      	break;
      }
      i++;
  }
  return listCustomer;
}

Cách 3: Phân trang với Criteria API

public List<Customer> getUsingCriteria(int position, int pageSize) {
  Session session = sessionFactory.openSession();
  Criteria criteria = session.createCriteria(Customer.class);
  criteria.setFirstResult(position);
  criteria.setMaxResults(pageSize);
  return criteria.list();
}

Cả 3 cách trên đều thự hiện lấy dữ liệu từ vị trí postion với số bản ghi là pageSize.

Giả sử bạn muốn chia tất cả các bản ghi thành 5 trang và lấy trang thứ 3 thì ta làm như sau:

  • Đếm tất cả số bản ghi
public long countTotalRecords() {
  Session session = sessionFactory.openSession();
  String countQ = "Select count (c.id) from Customer c";
  Query countQuery = session.createQuery(countQ);
  return (Long) countQuery.uniqueResult();
}
  • Tính số bản ghi trên mỗi trang bằng cách lấy tổng số bản ghi chia cho số trang.

Code ví dụ

Các công nghệ sử dụng

Tạo database trên MySQL

Trong ví dụ này mình tạo cơ sở dữ liệu ‘hibernate-demo’ với table customer (id, name, address) trong đó id tự tăng.

CREATE DATABASE  IF NOT EXISTS `hibernate-demo`;
CREATE TABLE `hibernate-demo`.`customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Code ví dụ Hibernate + MySQL +Maven + Eclipse (hướng dẫn hibernate)

Tạo Maven Project

Code ví dụ Hibernate Pagination, phân trang trong hibernate stackjava.com

Thư viện sử dụng

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>HibernateDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    <hibernate.version>5.1.0.Final</hibernate.version>
  </properties>
  <dependencies>
    <!-- Hibernate -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-c3p0</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <!-- MySQL JDBC driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>
  </dependencies>
</project>

File cấu hình hibernate

Chứa thông tin kết nối tới database (url, username, password), liệt kê các entity class được mapping với các table trong database

(Trường hợp sử dụng hibernate EntityManager thì sẽ sử dụng file META-INF/persistence.xml)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.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/hibernate-demo?useSSL=false</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">admin1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.hibernate.current_session_context_class">thread</property>
        
        <mapping class="stackjava.com.hibernatepagination.model.Customer" />
    </session-factory>
</hibernate-configuration>

File entity

Class Customer.java sẽ tương ứng với table customer trong database.

package stackjava.com.hibernatepagination.model;

import javax.persistence.*;

@Entity
@Table(name = "customer")
public class Customer {
  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @Column(name = "name")
  private String name;

  @Column(name = "address")
  private String address;
  
  // getter - setter
}

File DAO.

package stackjava.com.hibernatepagination.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import stackjava.com.hibernatepagination.model.Customer;

public class CustomerDAO {
  SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

  public void save(Customer customer) {
    Session session = sessionFactory.openSession();
    try {
      session.beginTransaction();
      session.save(customer);
      session.getTransaction().commit();
      System.out.println("insert success!");
    } catch (RuntimeException e) {
      session.getTransaction().rollback();
      e.printStackTrace();
    } finally {
      session.flush();
      session.close();
    }
  }
  
  public long countTotalRecords() {
    Session session = sessionFactory.openSession();
    String countQ = "Select count (c.id) from Customer c";
    Query countQuery = session.createQuery(countQ);
    return (Long) countQuery.uniqueResult();
  }
  
  public List<Customer> getUsingSession(int position, int pageSize) {
    Session session = sessionFactory.openSession();
    Query query = session.createQuery("FROM Customer");
    query.setFirstResult(position);
    query.setMaxResults(pageSize);
    return query.list();
  }
  
  public List<Customer> getUsingCriteria(int position, int pageSize) {
    Session session = sessionFactory.openSession();
    Criteria criteria = session.createCriteria(Customer.class);
    criteria.setFirstResult(position);
    criteria.setMaxResults(pageSize);
    return criteria.list();
  }
  
  public List<Customer> getUsingScroll(int position, int pageSize) {
    Session session = sessionFactory.openSession();
    Query query = session.createQuery("FROM Customer");
     
    ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY);
    resultScroll.setRowNumber(position);
    resultScroll.scroll(0);
    List<Customer> listCustomer = new ArrayList<Customer>();
    int i = 0;
    while (pageSize > i) {
      listCustomer.add((Customer) resultScroll.get(0));
        if (!resultScroll.next()) {
        	break;
        }
        i++;
    }
    return listCustomer;
  }
  
}

File InitData.java

Dùng để khởi tạo dữ liệu (ở đây mình insert 100 bản ghi vào table customer)

package stackjava.com.hibernatepagination;

import stackjava.com.hibernatepagination.dao.CustomerDAO;
import stackjava.com.hibernatepagination.model.Customer;

public class InitData {
  public static void main(String[] args) {
    CustomerDAO customerDAO = new CustomerDAO();
    for (int i = 1; i <= 100; i++) {
      customerDAO.save(new Customer("name" + i, "address" + i));
    }
  }

}

File MainApp.java

Thực hiện demo.

package stackjava.com.hibernatepagination;

import java.util.List;

import stackjava.com.hibernatepagination.dao.CustomerDAO;
import stackjava.com.hibernatepagination.model.Customer;

public class MainApp {
  public static void main(String[] args) {
    CustomerDAO customerDAO = new CustomerDAO();
    System.out.println("Total records: " + customerDAO.countTotalRecords());
    List<Customer> listCustomer = customerDAO.getUsingCriteria(5, 10);
    for(Customer customer : listCustomer) {
      System.out.println(customer);
    }
  }
  
}

Kết quả:

hibernate pagin, phân trang bằng hibernate

Code ví dụ Hibernate Pagination, phân trang trong hibernate stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References:

http://docs.jboss.org/hibernate/orm/…Hibernate_User_Guide.html

stackjava.com