STACKJAVA

So sánh Hibernate Criteria với HQL, HSQL /JPQL

So sánh Hibernate Criteria với HQL, HSQL /JPQL

(Xem lại: Code ví dụ Hibernate Criteria)
(Xem lại: Code ví dụ Hibernate Session (sử dụng HQL))

Ví dụ Hibernate Criteria với HQL

Trước tiên mình sẽ có một ví dụ để các bạn thấy sự khác biệt trong sử dụng criteria với hql:

Giả sử mình có 1 class Customer(id, name, address, description), bây giờ viết 1 hàm search với 3 tham số là name, address, description, nếu tham số nào null thì bỏ qua:

Sử dụng HQL

public static List<Customer> search(String name, String address, String description) {
  SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
  Session session = sessionFactory.openSession();

  if (name == null && address == null && description == null) {
    return session.createQuery("FROM Customer").list();
  }
  
  StringBuilder query = new StringBuilder("SELECT c FROM Customer c WHERE ");
  boolean firstCondition = true;
  if (name != null) {
    query.append(" c.name = '" + name + "'");
    firstCondition = false;
  }
  if (address != null) {
    if(!firstCondition) {
      query.append(" AND ");
    }
    query.append(" c.address = '" + address + "'");
    firstCondition = false;
  }
  if (description != null) {
    if(!firstCondition) {
      query.append(" AND ");
    }
    query.append(" c.description = '" + description + "'");
  }
  return session.createQuery(query.toString()).list();
}

Sử dụng Criteria

public static List<Customer> search(String name, String address, String description, Session session) {
  Criteria criteria = session.createCriteria(Customer.class);
  if (name != null) {
    criteria.add(Restrictions.eq("name", name));
  }
  if (address != null) {
    criteria.add(Restrictions.eq("address", address));
  }
  if (description != null) {
    criteria.add(Restrictions.eq("description", description));
  }
  List<Customer> result = criteria.list();
  return result;
}

Như các bạn thấy trong ví dụ trên:

HQL là một câu SQL, nó là stringnên bạn không thể biết nó có lỗi cú pháp cho tới khi runtime.Criteria thì ít bị lỗi đó hơn, và nó truy vấn giống hướng đối tượng hơn, mỗi điều kiện tương ứng với 1 đối tượng, cần thêm điều kiện thì thêm đối tượng đó vào.

Sự khác nhau chính giữa Criteria và Hibernate

HQL Criteria
Có thể sử dụng cho cả lệnh SELECT và NON-SELECT (UPDATE, DELETE, INSERT)
Chỉ sử dụng cho câu lệnh SELECT
Thích hợp cho các câu sql tĩnh (điều kiện không thay đổi) Thích hợp cho các câu sql động (điều kiện có thể thay đổi)
Không hỗ trợ phân trang Có hỗ trợ phân trang
Dễ bị SQL Injection trong trường hợp fix cứng các giá trị như ví dụ trên An toàn với SQL Injection hơn
Hỗ trợ bởi JPA Không hỗ trợ bởi JPA (mở rộng bởi Hibernate)

So sánh Hibernate Criteria với HQL, HSQL /JPQL

Okay, Done!

References:

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

https://code.i-harness.com/en/q/30362