Tìm hiểu về JPA Query Language

Thông thường, khi cần thao tác đến một database bất kỳ, chúng ta phải viết câu SQL dựa trên thông tin của các cột, các bảng trong database đó và có thể đối với mỗi loại database khác nhau, syntax của câu SQL cũng khác nhau. Để loại bỏ những nhược điểm này, các bạn có thể sử dụng JPA Query Language (JPQL). Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này nhé các bạn.

Đầu tiên, mình sẽ tạo một Maven project để làm ví dụ:

Tìm hiểu về JPA Query Language

Vì mình sẽ sử dụng JPA với implementation của Hibernate, do đó, mình sẽ thêm Hibernate dependencies như sau:

Project Lombok:

Điều đầu tiên mình cần nói với các bạn về JPA Query Language đó là nó cho phép chúng ta định nghĩa các câu query dựa trên các entity chứ không dựa vào tên các cột, các bảng trong database.

Cấu trúc và cú pháp của JPA Query Language thì rất tương tự như cấu trúc và cú pháp của câu SQL. Ví dụ như đối với câu lệnh SELECT, cú pháp của JPA Query Language như sau:

hay với DELETE,

UPDATE

Điều này giúp chúng ta dễ dàng định nghĩa các câu query sử dụng JPA Query Language nhưng các bạn cũng nên nhớ một điều là: mặc dù chúng ta định nghĩa các câu query sử dụng các entity nhưng trong thực tế, lúc chạy, Hibernate hay bất kỳ thư viện nào implement JPA đều transform những câu query đó sang những câu SQL dành cho database với tên cột, tên bảng của database đó.

Giả sử bây giờ mình sẽ sử dụng MySQL database làm ví dụ cho bài viết này. Mình có 1 table như sau:

Entity Clazz như sau:

Để làm việc với MySQL database, chúng ta cần sử dụng MySQL Driver dependency:

Tập tin cấu hình của JPA dành cho MySQL database:

Trong database, mình đang có những dữ liệu như sau:

Tìm hiểu về JPA Query Language

Giờ mình sẽ thử sử dụng JPA Query Language để lấy thông tin từ bảng clazz ra thử xem sao nha các bạn.

Đầu tiên, chúng ta sẽ lấy đối tượng EntityManager trước:

Tiếp theo chúng ta sẽ sử dụng đối tượng EntityManager để lấy đối tượng Query dựa vào thông tin của entity Clazz như sau:

Trong dòng code trên, chúng ta đã truyền cho phương thức createQuery() một câu JPA Query Language. Các bạn có thấy nó giống câu SQL mà chúng ta hay dùng để truy vấn database không? 😀 Chỉ có cái khác là lúc này nó sử dụng tên của entity của table clazz chứ không phải là tên của table clazz.

Các bạn cũng thấy là ở đây chúng ta đã đặt cho entity Clazz một alias c giống như trong câu SQL. Alias này các bạn có thể sử dụng giống như một biến trong Java, nghĩa là nếu muốn lấy thông tin các thuộc tính của entity Clazz, các bạn có thể sử dụng “c.<tên_của_thuộc_tính>”. Ví dụ như nếu các bạn muốn lấy thông tin column name trong table clazz thôi thì có thể viết lại câu JPA Query Language như sau:

Bây giờ, sau khi đã có đối tượng Query rồi, các bạn có thể sử dụng nó để lấy kết quả mà các bạn muốn như sau:

Đối tượng Query này có rất nhiều method, tuỳ theo câu JPA Query Language của bạn là gì thì các bạn hãy sử dụng method của nó cho phù hợp. Ở đây, câu JPA Query Language của mình là lấy tất cả các record trong bảng clazz, do đó mình sử dụng method getResultList().

Sau khi lấy xong, thì các bạn có thể in ra kết quả với đoạn code sau:

Kết quả:

Tìm hiểu về JPA Query Language

Toàn bộ code như sau:

 

7 thoughts on “Tìm hiểu về JPA Query Language

  1. Query query = em.createQuery(“SELECT c FROM Clazz c”);
    Câu này là truy vấn từ entity Clazz. Vậy bạn cho mình hỏi chỗ nào mapping entity Clazz với table Clazz trong database, để java có thể biết là bạn muốn truy vấn từ table Clazz trong database.
    Cảm ơn

      1. Mình nhìn thấy rồi bạn ạ. Nhưng mình đang k biết là chỗ nào mapping class Clazz với table Clazz trong database, bạn chỉ cho mình được không

Add Comment