Nội dung
Danh sách bài học
- 01~4 phút
Repository & Queries — tổng quan
Module này mổ cách query dữ liệu qua Spring Data: từ derived query, @Query, projection, Specification, tới pagination hiệu năng.
- 02~12 phút
JpaRepository & Derived Queries — zero-code query từ tên method
Spring Data JPA parse tên method thành JPQL tự động lúc startup. Bài này bóc interface hierarchy CrudRepository→PagingAndSortingRepository→JpaRepository, cơ chế Spring Data parse findByStatusAndOwnerId thành JPQL rồi Hibernate dịch sang SQL, và khi nào derived query đủ — khi nào nên nhường chỗ cho @Query.
- 03~12 phút
@Query, @Modifying và Projection — viết query tuỳ chỉnh và trả về đúng shape
Ba kỹ thuật bổ sung derived query: @Query cho JPQL hoặc native SQL khi method name không đủ; @Modifying cho UPDATE/DELETE với pitfall persistence context stale; projection (interface, DTO, class-based) để chỉ fetch field cần thay vì load full entity.
- 04~12 phút
Specification & JPA Auditing — dynamic filter và timestamp tự động
Specification bọc JPA Criteria API để build dynamic query không cần viết N method. JPA Auditing tự set createdAt/updatedAt qua AuditingEntityListener. Bài này đào sâu cơ chế bên dưới cả hai: Predicate tree, PredicateVisitor, EntityCallback lifecycle.
- 05~13 phút
Pageable & Sort — phân trang, sắp xếp, validate, projection DTO
Pageable wrap LIMIT/OFFSET SQL, Spring tự sinh 2 câu query (data + COUNT), kết quả trả về trong Page chứa content và totalElements. Bài này đào sâu cơ chế bên dưới: vì sao Page cần COUNT, vì sao phải cap size tránh DoS, sort multi-field, và projection DTO kết hợp Pageable.
- 06~12 phút
Pagination performance — OFFSET vs keyset, Slice bỏ COUNT
OFFSET pagination chậm dần tuyến tính theo depth vì DB phải scan và bỏ N row trước khi trả kết quả. Keyset/cursor pagination nhảy thẳng vào vị trí qua B-tree index, tốc độ hằng số. Slice loại COUNT query. Bài này giải thích cơ chế từng chiến lược, trade-off, và khi nào chọn cái nào.
- 07~4 phút
Repository & Queries — tổng kết
Tóm tắt Repository & Queries.