Tìm Hiểu Về JPA Query Language - Hướng Dẫn Java
Có thể bạn quan tâm
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ụ:

Vì mình sẽ sử dụng JPA với implementation của Hibernate, do đó, mình sẽ thêm Hibernate dependencies như sau:
XHTML <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.12.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.2.12.Final</version> </dependency>| 12345678910 | <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.12.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.2.12.Final</version></dependency> |
Project Lombok:
XHTML <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency>| 123456 | <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version><scope>provided</scope></dependency> |
Đ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:
MySQL SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING ...]] [ORDER BY ...]| 1234 | SELECT...FROM...[WHERE...][GROUPBY...[HAVING...]][ORDER BY...] |
hay với DELETE,
MySQL DELETE FROM ... [WHERE ...]| 1 | DELETEFROM...[WHERE...] |
UPDATE
MySQL UPDATE ... SET ... [WHERE ...]| 1 | UPDATE...SET...[WHERE...] |
Đ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:
MySQL CREATE TABLE `clazz` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;| 12345 | CREATETABLE`clazz`(`id`int(11)NOT NULLAUTO_INCREMENT,`name`varchar(45)NOT NULL,PRIMARY KEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8; |
Entity Clazz như sau:
Java package com.huongdanjava.jpa; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table @Getter @Setter public class Clazz { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; }| 12345678910111213141516171819202122232425 | packagecom.huongdanjava.jpa; importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Table; importlombok.Getter;importlombok.Setter; @Entity@Table@Getter@SetterpublicclassClazz{ @Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid; @ColumnprivateStringname;} |
Để làm việc với MySQL database, chúng ta cần sử dụng MySQL Driver dependency:
XHTML <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>| 12345 | <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.6</version></dependency> |
Tập tin cấu hình của JPA dành cho MySQL database:
XHTML <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence_2_1.xsd"> <persistence-unit name="jpaexample" transaction-type="RESOURCE_LOCAL"> <class>com.huongdanjava.jpa.Clazz</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa_example" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="123456" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.use_sql_comments" value="true" /> </properties> </persistence-unit> </persistence>| 1234567891011121314151617181920 | <persistence version="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence_2_1.xsd"> <persistence-unit name="jpaexample"transaction-type="RESOURCE_LOCAL"><class>com.huongdanjava.jpa.Clazz</class><exclude-unlisted-classes>true</exclude-unlisted-classes> <properties><property name="javax.persistence.jdbc.driver"value="com.mysql.jdbc.Driver" /><property name="javax.persistence.jdbc.url"value="jdbc:mysql://localhost:3306/jpa_example" /><property name="javax.persistence.jdbc.user"value="root" /><property name="javax.persistence.jdbc.password"value="123456" /> <property name="hibernate.format_sql"value="true" /><property name="hibernate.show_sql"value="true" /><property name="hibernate.use_sql_comments"value="true" /></properties></persistence-unit></persistence> |
Trong database, mình đang có những dữ liệu như sau:

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:
Java EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaexample"); EntityManager em = emf.createEntityManager();| 12 | EntityManagerFactory emf=Persistence.createEntityManagerFactory("jpaexample");EntityManager em=emf.createEntityManager(); |
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:
Java Query query = em.createQuery("SELECT c FROM Clazz c");| 1 | Query query=em.createQuery("SELECT c FROM Clazz c"); |
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:
MySQL SELECT c.name FROM Clazz c| 1 | SELECTc.nameFROMClazzc |
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:
Java List<Clazz> resultList = query.getResultList();| 1 | List<Clazz>resultList=query.getResultList(); |
Đố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:
Java resultList.stream().forEach(c -> System.out.println(c.getName()));| 1 | resultList.stream().forEach(c->System.out.println(c.getName())); |
Kết quả:

Toàn bộ code như sau:
Java package com.huongdanjava.jpa; import javax.persistence.*; import java.util.List; public class Application { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaexample"); EntityManager em = emf.createEntityManager(); Query query = em.createQuery("SELECT c FROM Clazz c"); List<Clazz> resultList = query.getResultList(); resultList.stream().forEach(c -> System.out.println(c.getName())); } }| 1234567891011121314151617 | packagecom.huongdanjava.jpa; importjavax.persistence.*;importjava.util.List; publicclassApplication{ publicstaticvoidmain(String[]args){EntityManagerFactory emf=Persistence.createEntityManagerFactory("jpaexample");EntityManager em=emf.createEntityManager(); Query query=em.createQuery("SELECT c FROM Clazz c");List<Clazz>resultList=query.getResultList(); resultList.stream().forEach(c->System.out.println(c.getName()));}} |
Từ khóa » Jpql Là Gì
-
Jpql Là Gì ? Sự Dùng Hibernate Đã Lâu - Trang Tổng Hợp Online
-
Jpql Là Gì ? Sự Dùng Hibernate Đã Lâu - Darkedeneurope
-
Tổng Quan Về JPA (Java Persistence API) | TopDev
-
Tìm Hiểu Về JPA Query Language - Hướng Dẫn Java - Chickgolden
-
Giới Thiệu Về Spring JPA - Techmaster
-
Truy Vấn Dữ Liệu Thông Qua Spring Data JPA - CodeGym Chia Sẻ
-
Jpql Là Gì ? Sự Dùng Hibernate Đã Lâu | Lội-suố
-
Jpql Là Gì ? Sự Dùng Hibernate Đã Lâu | Leo-đè
-
JPA Là Gì? Sự Khác Nhau Giữa JPA Với Hibernate - STACKJAVA
-
Jpa Là Gì - Java Persistence Api - Có Nghĩa Là Gì, Ý Nghĩa La Gi 2021
-
Sự Khác Biệt Giữa Hibernate Và JPA (Công Nghệ) - Sawakinome
-
Dùng Hibernate đã Lâu? Bạn Có Biết Mối Tương Quan Giữa JPA
-
Giới Thiệu Về Spring Data JPA - Tại Sao Cần Sử Dụng Nó?
-
JPA Criteria API Là Gì ? Tại Sao Nên Sử Dụng ? - Học Spring Boot