Hibernate - Ngôn ngữ truy vấn
Ngôn ngữ truy vấn Hibernate (HQL) là một ngôn ngữ truy vấn hướng đối tượng, tương tự như SQL, nhưng thay vì hoạt động trên bảng và cột, HQL hoạt động với các đối tượng liên tục và thuộc tính của chúng. Các truy vấn HQL được Hibernate dịch thành các truy vấn SQL thông thường, từ đó thực hiện hành động trên cơ sở dữ liệu.
Mặc dù bạn có thể sử dụng câu lệnh SQL trực tiếp với Hibernate bằng Native SQL, nhưng tôi khuyên bạn nên sử dụng HQL bất cứ khi nào có thể để tránh những phức tạp về tính di động của cơ sở dữ liệu và tận dụng các chiến lược tạo SQL và bộ nhớ đệm của Hibernate.
Các từ khóa như SELECT, FROM và WHERE, v.v., không phân biệt chữ hoa chữ thường, nhưng các thuộc tính như tên bảng và cột phân biệt chữ hoa chữ thường trong HQL.
Mệnh đề FROM
Bạn sẽ sử dụng FROMnếu bạn muốn tải một đối tượng liên tục hoàn chỉnh vào bộ nhớ. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề FROM:
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
Nếu bạn cần đủ điều kiện cho một tên lớp trong HQL, chỉ cần chỉ định gói và tên lớp như sau:
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
Mệnh đề AS
Các ASmệnh đề có thể được sử dụng để gán bí danh cho các lớp trong các truy vấn HQL của bạn, đặc biệt khi bạn có các truy vấn dài. Ví dụ, ví dụ đơn giản trước đây của chúng tôi sẽ như sau:
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
Các AS từ khóa là tùy chọn và bạn cũng có thể chỉ định bí danh ngay sau tên lớp, như sau:
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Mệnh đề SELECT
Các SELECTmệnh đề cung cấp nhiều quyền kiểm soát hơn đối với tập kết quả sau đó là mệnh đề from. Nếu bạn muốn lấy một vài thuộc tính của các đối tượng thay vì đối tượng hoàn chỉnh, hãy sử dụng mệnh đề SELECT. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề SELECT để chỉ lấy trường first_name của đối tượng Employee:
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Điều đáng chú ý ở đây là Employee.firstName là thuộc tính của đối tượng Employee chứ không phải là trường của bảng EMPLOYEE.
Mệnh đề WHERE
Nếu bạn muốn thu hẹp các đối tượng cụ thể được trả về từ bộ nhớ, bạn sử dụng mệnh đề WHERE. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề WHERE:
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
ĐẶT HÀNG THEO Mệnh đề
Để sắp xếp kết quả truy vấn HQL của bạn, bạn sẽ cần sử dụng ORDER BYmệnh đề. Bạn có thể sắp xếp các kết quả theo bất kỳ thuộc tính nào trên các đối tượng trong tập hợp kết quả tăng dần (ASC) hoặc giảm dần (DESC). Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề ORDER BY:
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
Nếu bạn muốn sắp xếp theo nhiều thuộc tính, bạn chỉ cần thêm các thuộc tính bổ sung vào cuối mệnh đề theo thứ tự, được phân tách bằng dấu phẩy như sau:
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
Mệnh đề GROUP BY
Mệnh đề này cho phép Hibernate lấy thông tin từ cơ sở dữ liệu và nhóm nó dựa trên giá trị của một thuộc tính và thông thường, sử dụng kết quả để bao gồm một giá trị tổng hợp. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề GROUP BY:
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
Sử dụng các tham số được đặt tên
Hibernate hỗ trợ các tham số được đặt tên trong các truy vấn HQL của nó. Điều này làm cho việc viết các truy vấn HQL chấp nhận đầu vào từ người dùng dễ dàng và bạn không phải phòng thủ trước các cuộc tấn công SQL injection. Sau đây là cú pháp đơn giản của việc sử dụng các tham số được đặt tên:
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
Điều khoản CẬP NHẬT
Cập nhật hàng loạt là mới đối với HQL với Hibernate 3 và công việc xóa trong Hibernate 3 khác với công việc đã làm trong Hibernate 2. Giao diện Truy vấn hiện chứa một phương thức gọi là executeUpdate () để thực hiện các câu lệnh HQL UPDATE hoặc DELETE.
Các UPDATEmệnh đề có thể được sử dụng để cập nhật một hoặc nhiều thuộc tính của một hoặc nhiều đối tượng. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề UPDATE:
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Mệnh đề DELETE
Các DELETEmệnh đề có thể được sử dụng để xóa một hoặc nhiều đối tượng. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề DELETE:
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Mệnh đề INSERT
HQL hỗ trợ INSERT INTOmệnh đề chỉ nơi các bản ghi có thể được chèn từ đối tượng này sang đối tượng khác. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề INSERT INTO:
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Phương pháp tổng hợp
HQL hỗ trợ một loạt các phương thức tổng hợp, tương tự như SQL. Chúng hoạt động theo cùng một cách trong HQL như trong SQL và sau đây là danh sách các hàm có sẵn:
Sr.No. | Chức năng & Mô tả |
---|---|
1 | avg(property name) Giá trị trung bình của một tài sản |
2 | count(property name or *) Số lần một thuộc tính xuất hiện trong kết quả |
3 | max(property name) Giá trị lớn nhất của các giá trị thuộc tính |
4 | min(property name) Giá trị tối thiểu của các giá trị thuộc tính |
5 | sum(property name) Tổng các giá trị thuộc tính |
Các distincttừ khóa chỉ tính các giá trị duy nhất trong tập hợp hàng. Truy vấn sau sẽ chỉ trả về số lượng duy nhất -
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Phân trang bằng cách sử dụng Truy vấn
Có hai phương pháp của giao diện Truy vấn để phân trang.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | Query setFirstResult(int startPosition) Phương thức này nhận một số nguyên đại diện cho hàng đầu tiên trong tập kết quả của bạn, bắt đầu bằng hàng 0. |
2 | Query setMaxResults(int maxResult) Phương thức này yêu cầu Hibernate truy xuất một số cố định maxResults của các đối tượng. |
Sử dụng hai phương pháp trên cùng nhau, chúng ta có thể tạo một thành phần phân trang trong ứng dụng web hoặc Swing của mình. Sau đây là ví dụ mà bạn có thể mở rộng để tìm nạp 10 hàng cùng một lúc -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();