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`) );
Tạo Maven Project
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ả:
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