×

Sử dụng JPA Criteria API để xây dựng truy vấn động trong Java

Java Persistence API (JPA) là một trong những công cụ quan trọng để làm việc với dữ liệu trong Java, và Criteria API là một thành phần mạnh mẽ của JPA, giúp xây dựng các truy vấn động một cách mượt mà và hiệu quả. Criteria API hỗ trợ việc tạo truy vấn mà không cần viết mã SQL trực tiếp. Điều này giúp mã nguồn dễ bảo trì, dễ hiểu và ít lỗi hơn so với việc sử dụng chuỗi SQL truyền thống. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Criteria API để xây dựng các truy vấn động trong Java.

1. Cài đặt môi trường

Trước khi khám phá Criteria API, bảo đảm rằng bạn đã thiết lập dự án với JPA và một cơ sở dữ liệu. Bạn có thể sử dụng bất kỳ công cụ nào như Hibernate, EclipseLink đi kèm với JPA. Dưới đây là một ví dụ về thiết lập với Hibernate:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.0.Final</version>
</dependency>
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>

2. Khởi tạo EntityManager

EntityManager là giao diện chính để tương tác với Persistence Context. Bạn cần một EntityManager để sử dụng Criteria API.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();

3. Bắt đầu với CriteriaBuilder

CriteriaBuilder là điểm khởi đầu cho mọi truy vấn Criteria. Nó cung cấp các phương thức để tạo CriteriaQuery, các điều kiện và các biểu thức khác.

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<MyEntity> root = cq.from(MyEntity.class);
cq.select(root);

4. Thêm điều kiện vào truy vấn (Predicates)

Predicates trong Criteria API giúp tạo các điều kiện lọc dữ liệu. Bạn có thể kết hợp nhiều Predicates để xây dựng các điều kiện phức tạp.

List<Predicate> predicates = new ArrayList<>();
if (condition1) {
    predicates.add(cb.equal(root.get("field1"), value1));
}
if (condition2) {
    predicates.add(cb.like(root.get("field2"), "%" + value2 + "%"));
}
cq.where(predicates.toArray(new Predicate[0]));

5. Thực hiện truy vấn

Sau khi xây dựng truy vấn, bạn có thể sử dụng EntityManager để thực hiện.

TypedQuery<MyEntity> query = em.createQuery(cq);
List<MyEntity> results = query.getResultList();

6. Ví dụ phức tạp

Hãy cùng xem một ví dụ phức tạp hơn, nơi chúng ta kết hợp nhiều loại điều kiện và sắp xếp kết quả.

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<MyEntity> root = cq.from(MyEntity.class);

List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("status"), "ACTIVE"));
predicates.add(cb.between(root.<Date>get("createdDate"), startDate, endDate));

cq.where(cb.and(predicates.toArray(new Predicate[0])));
cq.orderBy(cb.desc(root.get("createdDate")))

TypedQuery<MyEntity> query = em.createQuery(cq);
List<MyEntity> results = query.getResultList();

7. Kết luận

Việc sử dụng Criteria API trong JPA mang lại nhiều lợi ích như tăng tính động của truy vấn, dễ bảo trì và an toàn với lỗi so với việc sử dụng chuỗi SQL thông thường. Criteria API còn cung cấp sự linh hoạt lớn khi làm việc với ORM (Object-Relational Mapping), giúp cho việc viết truy vấn phức tạp trở nên đơn giản và hiệu quả hơn.

Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về việc sử dụng Criteria API để xây dựng các truy vấn động trong Java. Hãy thử áp dụng và khám phá thêm nhiều tính năng mạnh mẽ khác của JPA Criteria API trong các dự án của bạn.

Comments