Code ví dụ Hibernate Criteria (Hibernate Criteria Queries vs Restrictions)
Trong ví dụ này mình sẽ thực hiện truy vấn database – table customer (id, name, address, date_of_birth, description) tương ứng với đối tượng Customer.java trong java
1. Criteria basic query
Đối tượng criteria dưới đây sẽ lấy tất cả các bản khi trong table customer
Criteria criteria = session.createCriteria(Customer.class);
2. Criteria ordering query (Sắp xếp)
Lệnh sau đây sẽ sắp xếp các đối tượng trong criteria theo thứ thự dateOfBirth
tăng dần
criteria.addOrder(Order.asc("dateOfBirth"));
3. Criteria restrictions query (Criteria với Restrictions)
(Trước kia là sử dụng Expression
, nhưng sau đó Expression
không còn được sử dụng mà chuyển sang Restrictions
)
Restrictions.eq dùng để so sánh bằng
Ví dụ lệnh sau đây sẽ chỉ lấy các đối tượng có field address = ‘usa’
criteria.add(Restrictions.eq("address", "usa"));
Restrictions.lt, le, gt, ge dùng để so sánh hơn kém
Chỉ lấy các đối tượng có id < 3
criteria.add(Restrictions.lt("id", 3));
Chỉ lấy các đối tượng có id <= 3
criteria.add(Restrictions.le("id", 3));
Chỉ lấy các đối tượng có id > 3
criteria.add(Restrictions.gt("id", 3));
Chỉ lấy các đối tượng có id >= 3
criteria.add(Restrictions.le("id", 3));
Restrictions.like dùng để kiểm tra khớp một phần (câu lệnh like trong sql)
Chỉ lấy các đối tượng có field name bao gồm ‘th’
criteria.add(Restrictions.like("name", "%th%"));
Restrictions.between dùng để lọc các đối có field kiểu datetime nằm giữa khoảng nào đó
Chỉ lấy các đối tượng có dateOfBirth trong khoảng 1/1/1000 tới 1/1/1900
Calendar cal = Calendar.getInstance(); cal.set(1000, 1, 1); Date startDate = cal.getTime(); cal.set(1900, 1, 1); Date endDate = cal.getTime(); criteria.add(Restrictions.between("dateOfBirth", startDate, endDate));
Restrictions.isNull, isNotNull dùng để lọc các field có giá trị null hoặc không null
Chỉ lấy các đối tượng có field description khác null
criteria.add(Restrictions.isNotNull("description"));
Ngoài ra còn các Restrictions
khác như in, isEmpty, isNotEmpty...
Đặc biệt ta có thể kết hợp các điều kiện khác nhau, giúp cho việc truy vấn linh hoạt hơn.
Ví dụ mình có một hàm search theo name, address, description, nếu tham số nào bằng null thì ta bỏ qua, chỉ search theo nhưng tham số khác null.
public static List<Customer> search(String name, String address, String description) { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Customer.class); if (name != null) { criteria.add(Restrictions.like("name", "%"+name+"%")); } if (address != null) { criteria.add(Restrictions.like("address", "%"+address+"%")); } if (description != null) { criteria.add(Restrictions.like("description", "%"+description+"%")); } List<Customer> result = criteria.list(); session.close(); sessionFactory.close(); return result; }
3. Criteria paging the result (Phân trang)
Để phân trang với criteria ta dùng setMaxResults
để giới hạn số phần tử được lấy và setFirstResult
để chỉ định vị trí bắt đầu lấy
Ví dụ: lấy 5 đối tượng customer từ vị trí thứ 3.
criteria.setMaxResults(5); criteria.setFirstResult(3);
4. 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’-criteria với table customer (id, name, address, date_of_birth, description) trong đó id tự tăng.
CREATE DATABASE IF NOT EXISTS `hibernate-criteria-demo`; CREATE TABLE `hibernate-criteria-demo`.`customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `date_of_birth` date DEFAULT NULL, `description` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) );
Khởi tạo dữ liệu ban đầu:
INSERT INTO `hibernate-criteria-demo`.`customer` VALUES (1,'kai','viet nam','1990-10-10','desc1'); INSERT INTO `hibernate-criteria-demo`.`customer` VALUES (2,'thanos','titan','1000-10-05','boss'); INSERT INTO `hibernate-criteria-demo`.`customer` VALUES (3,'thor','asgard','1500-01-01',''); INSERT INTO `hibernate-criteria-demo`.`customer` VALUES (4,'hulk','usa','1980-02-03','professor'); INSERT INTO `hibernate-criteria-demo`.`customer` VALUES (5,'doctor strange','usa','1970-03-04','doctor'); INSERT INTO `hibernate-criteria-demo`.`customer` VALUES (6,'bruce lee','china','1960-02-02','kungfu masters');
Tạo Maven Project
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.1.0.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency>
File cấu hình hibernate
<?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-criteria-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.hibernatecriteria.entities.Customer" /> </session-factory> </hibernate-configuration>
File entity
package stackjava.com.hibernatecriteria.entities; import java.text.SimpleDateFormat; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @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; @Column(name = "date_of_birth") private Date dateOfBirth; @Column(name = "description") private String description; // getter - setter }
File Demo
Search các đối tượng customer có name chứa ‘h’ và address chứa ‘a’
package stackjava.com.hibernatecriteria; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Restrictions; import stackjava.com.hibernatecriteria.entities.Customer; public class DemoCriteria { public static void main(String[] args) { List<Customer> listCustomer = search("h", "a", null); for (Customer customer: listCustomer) { System.out.println(customer); } } @SuppressWarnings("unchecked") public static List<Customer> search(String name, String address, String description) { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Customer.class); if (name != null) { criteria.add(Restrictions.like("name", "%"+name+"%")); } if (address != null) { criteria.add(Restrictions.like("address", "%"+address+"%")); } if (description != null) { criteria.add(Restrictions.like("description", "%"+description+"%")); } List<Customer> result = criteria.list(); session.close(); sessionFactory.close(); return result; } }
Demo + Kết quả
Customer [id=2, name=thanos, address=titan, dateOfBirth=1000/10/05, description=boss] Customer [id=3, name=thor, address=asgard, dateOfBirth=1500/01/01, description=] Customer [id=4, name=hulk, address=usa, dateOfBirth=1980/02/03, description=professor]
Code ví dụ Hibernate Criteria (Hibernate Criteria Queries vs Restrictions) stackjava.com
Okay, Done!
Download code ví dụ trên tại đây.
References: