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:
string
nê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 |
|
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!