Criteria Hibernate là gì

Created
Oct 28, 2021 8:15 AM
Tags
spring bootmiddle
Chapter
  • Giới thiệu
  • Cài đặt
  • JPA Meta Model
  • Predicate

Giới thiệu

Trong bài viết trước, tôi đã giới thiệu với các bạn vềCriteria APIcủaHibernate.

  1. Hibernate là gì?
  2. Hướng dẫn sử dụng Criteria API trong Hibernate

Trong phần này chúng ta sẽ tìm hiểu một số các phần cần thiết khác trongCriteria API, thứ giúp cho bạn xây dựng query một cách đơn giản hơn.

Trong bài có sử dụng:

  1. Lombok

Cài đặt

Nhớ thêmspring-boot-starter-data-jpavào dependencies của bạn.

Trong phần này, tôi xàiH2 databaseđể demo. [H2 là dạng memory database, nó sẽ lưu trong ram và khi tắt chương trình nó sẽ mất sạch]

4.0.0org.springframework.bootspring-boot-starter-parent2.0.5.RELEASE me.loda.springexample-independent-maven-spring-project0.0.1-SNAPSHOTexample-independent-maven-spring-projectDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtoolsruntimetrueorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtest org.springframework.bootspring-boot-starter-data-jpa com.h2databaseh2runtime org.hibernatehibernate-jpamodelgen5.4.9.Finalprovidedorg.springframework.bootspring-boot-maven-plugin

Đặc biệt, chú ýhibernate-jpamodelgen, tôi sẽ giải thích tác dụng của nó trước.

JPA Meta Model

trongbài trướcmọi người cũng biết cách cấu trúc của một câu query trong Criteria API:

SELECT o FROM Office o WHERE o.city = 'hanoi'

Lúc này query của chúng ta sẽ như thế này:

query.select[root].where[builder.equal[root.get["city"], "hanoi"]];

Để ý thì có thể thấy, khi muốn lấy columncityđể kiểm tra, chúng ta đang hardcode bằngString.

Có một số bất lợi khi làm vậy, thứ nhất là bạn phải tự nhớ tên các column mỗi khi gọi, thứ hai là bạn sẽ phải tìm kiếm tất cả các chỗ sử dụng mỗi sửa đổi tên cột.

Cách giải quyết hay nhất là tham chiếu tên các column củaTablevào mộtObjectđể chúng ta có thể gọi tới mỗi khi sử dụng. Khi có sự thay đổi, chỉ cần thay đổi trong đối tượng này là xong. Đối tượng biểu diễn này được gọi làMeta Model.

Và rất may là Hibernate hỗ trợ chúng ta tự động generate ra các Meta Model từ các class@Entity

Ví dụ:

Chúng ta có Class EntityUser

User.java

@Entity @Data @Builder public class User { @Id @GeneratedValue[strategy = GenerationType.IDENTITY] private Long id; private UserType type; private String name; public enum UserType { NORMAL, VIP; } }

Thì class Meta Model củaUsersẽ tên làUser_và có cấu trúc như sau:

@Generated[value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor"] @StaticMetamodel[User.class] public abstract class User_ { public static volatile SingularAttribute name; public static volatile SingularAttribute id; public static volatile SingularAttribute type; public static final String NAME = "name"; public static final String ID = "id"; public static final String TYPE = "type"; }

Để có thể Generate ra các class Meta Model, bạn sẽ cần thêm dependencyhibernate-jpamodelgenvào project của mình.

org.hibernatehibernate-jpamodelgenCURRENT-VERSION

Khi build jar nó sẽ tự động generate thêm cho bạn

Để có thể sử dụng trong IDE, bạn có thể Config Annotation Processor [Giống với Lombok], để IDE hiểu và tự động generate ra giúp bạn lập trình dễ hơn.

Predicate

Để có thể xây dựng câu truy vấn một cách trọn vẹn, bạn cần biếtPredicate.

Tạm hiểu một cách đơn giản thìPredicatelà một mệnh đề điều kiện trong câu lệnh truy vấn.

Như ví dụ ở dưới đây:

@Repository public class CustomUserRepository { @PersistenceContext private EntityManager em; public User getUserById[Long id] { CriteriaBuilder builder = em.getCriteriaBuilder[]; CriteriaQuery query = builder.createQuery[User.class]; Root root = query.from[User.class]; Predicate condition = builder.equal[root.get[User_.ID], id]; query.select[root].where[condition]; return em.createQuery[query].getSingleResult[]; } }

Predicatecó thể liên kết với nhau bằng các phép quan hệand,or,not, v.v..

Ví dụ:

public Collection getUserByComplexConditions[String name, UserType type] { CriteriaBuilder builder = em.getCriteriaBuilder[]; CriteriaQuery query = builder.createQuery[User.class]; Root root = query.from[User.class]; Predicate hasNameLike = builder.like[root.get[User_.NAME], name]; Predicate hasType = builder.equal[root.get[User_.TYPE], type]; Predicate condition = builder.and[hasNameLike, hasType]; query.select[root].where[condition]; return em.createQuery[query].getResultList[]; }

Tới đây bạn đã nắm được cơ bảnCriteria APIvà đã có thể tự sử dụng nó trong đa số các câu lệnh đơn giản.

Trong bài tiếp theo, tôi sẽ hướng dẫn nốt các join bảng nữa thôi là bạn sẽ mas con ông ter.

Nếu có, toàn bộ project / code mẫu được lưu trữ tại GitHub

Đây là một bài viết trong

[SB0] Series làm chủ Spring Boot - Zero to Hero

Nếu bạn phát hiện bài viết có lỗi hoặc outdated, hãy báo lại giúp mình theo email: hoặc qua Nam Hoàng Nguyễn [facebook.com]

Video liên quan

Chủ Đề