Code ví dụ Hibernate Criteria (Hibernate Criteria Queries vs Restrictions)

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 đó Expressionkhô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');

Code ví dụ Hibernate Criteria (Hibernate Criteria Queries vs Restrictions)

Tạo Maven Project

 Code ví dụ Hibernate Criteria (Hibernate Criteria Queries vs Restrictions)
Thư viện sử dụng
<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:

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

stackjava.com