post-image

HQL(Hibernate Query Language) là gì ?

1. Tổng quan

Hibernate cung cấp cho chúng ta khá nhiều cách để có thể thao tác dữ liệu với database và có thể kể đến như là HQL (Hibernate Query Language), Hibernate Criteria Queries, Native Queries, … Bài viết này  sẽ giới thiệu với mọi người về HQL và lý giải cho chúng ta biết nó là gì ? Và sử dụng nó như thế nào.

HQL là gì ?

HQL là một ngôn ngữ truy vấn hướng đối tượng tương tự như ngôn ngữ SQL mà chúng ta hay sử dụng. Tuy nhiên thay vì sử dụng trên các bảng, các cột HQL lại làm việc với các đối tượng president và các thuộc tính của chúng và nó không phụ thuộc vào bất kỳ một database nào.

Các đặc điểm của HQL

Ngôn ngữ truy vấn HQL có một số đặc điểm như sau:

  • HQL không phân biệt hoa thường (giống với ngôn ngữ SQL)
  • From trong HQL cũng tương tự như SQL và chúng ta cũng có thể đặt alias cho nó ví dụ như mình muốn lấy ra tất cả các sản phẩm của Product câu lệnh sẽ là: Select Product p tương đương với câu lệnh select * from Product as p trong SQL
  • HQL hỗ trợ tất cả các loại Join có trong SQL như là Left Join, Right Join, Inner Join, Full Join,…
  • HQL hỗ trợ các hàm thực hiện các phép toán như count, max, min, sum,…
  • Chúng ta cũng có thể sử dụng các biểu thức so sánh trong HQL tương tự như là SQL
  • Hỗ trợ câu lệnh order by để sắp xếp, Group By để phân nhóm

Sử dụng HQL trong SpringBoot

Sử dụng câu lệnh Select

Nếu không có câu lệnh SELECT, HQL sẽ lấy tất cả các thuộc tính của 1 Entity. Chúng ta có thể chỉ rõ những cột mà ta cần lấy bằng cách sử dụng mệnh đề SELECT.

Ví dụ: Lấy ra tên của 1 sản phẩm

String hql = "SELECT p.name FROM Product p WHERE p.id = :id";
String productName = session.createQuery(hql, String.class).setParameter("id", 1L).uniqueResult();

Sử dụng câu lệnh From

Chúng ta có thể sử dụng câu lệnh From để lấy ra danh sách các thực thể.

Ví dụ nếu muốn lấy ra danh sách các sản phẩm thì câu lệnh sẽ như sau:

String hql = "FROM Product";
List<Product> products = session.createQuery(hql, Product.class).list();

Sử dụng câu lệnh Where

Giống như SQL, chúng ta sử dụng câu lệnh Where cho trường hợp muốn xét điều kiện để truy vấn các bản ghi.

Ví dụ chúng ta chỉ  muốn lấy ra sản phẩm có tên là “IPhone 12” thì câu lệnh của nó sẽ như sau:

String hql = "FROM Product AS p WHERE p.name = :name";
Product product = session.createQuery(hql, Product.class).setParameter("name", "IPhone 12").uniqueResult();

Sử dụng câu lệnh Order By

Để sắp xếp kết quả truy vấn HQL, ta sẽ sử dụng mệnh đề ORDER BY. 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 kết quả hoặc tăng dần (ASC) hoặc giảm dần (DESC).

Ví dụ: lấy danh sách Product  sắp xếp theo tên giảm dần câu lệnh sẽ như sau:

String hql = "FROM Product p ORDER BY p.name DESC";
List<Product> products= session.createQuery(hql, Product.class).list();

Câu lệnh Group By

Để phân nhóm dữ lliệu chúng ta sử dụng câu lệnh Group By

Ví dụ đếm số lượng product được tạo theo mỗi tháng của năm hiện tại.

String hql = "SELECT month(createdAt) AS month, COUNT(id) AS numberOfProduct FROM Product WHERE year(createdAt) = year(sysdate()) GROUP BY month(createdAt) HAVING COUNT(id) > 3";
List<Object[]> result = session.createQuery(hql).list();

Câu lệnh Update

Câu lệnh update được sử dụng khi chúng ta muốn cập nhật thông tin cho 1 hoặc nhiều đối tượng tương tự như SQL

Ví dụ mình muốn cập nhật thông tin sản phẩm có id là 1 thì câu lệnh sẽ là

String hql = "UPDATE Product SET name = :name, price = :price WHERE id = :id";
Query query = session.createQuery(hql);
query.setParameter("name", "IPhone 12");
query.setParameter("price", 30000000);
query.setParameter("id", 1L);
int affectedRows = query.executeUpdate();

Câu lệnh Delete

Để xoá một bản ghi với HQL chúng ta sử dụng câu lệnh Delete

Giả sử nếu bạn muốn xoá một Product có id = 1 câu lệnh sẽ là

String hql = "DELETE FROM Product WHERE id = :id";
Query query = session.createQuery(hql);
query.setParameter("id", 1L);
int affectedRows = query.executeUpdate();

Leave a Reply

Your email address will not be published. Required fields are marked *