Ba interface kế thừa nhau trong Spring Data hierarchy:
Repository (marker)
└── CrudRepository ← CRUD cơ bản
└── PagingAndSortingRepository ← + pagination/sorting
└── JpaRepository ← + JPA-specific methodsCrudRepository — CRUD căn bản:
java
save(), findById(), findAll(), existsById(), deleteById(), count()PagingAndSortingRepository — thêm:
java
findAll(Pageable pageable)
findAll(Sort sort)JpaRepository — thêm JPA-specific:
java
saveAll(), saveAllAndFlush(), deleteAllInBatch()
getReferenceById() // lazy reference, không hit DB ngay
flush()java
// Trong thực tế: hầu hết dùng JpaRepository
public interface UserRepository extends JpaRepository<User, Long> {
// thừa hưởng tất cả + viết thêm custom
Optional<User> findByEmail(String email);
Page<User> findByActive(boolean active, Pageable pageable);
}
// Pagination:
Page<User> page = userRepo.findByActive(
true,
PageRequest.of(0, 20, Sort.by("createdAt").descending())
);
page.getContent(); // List<User>
page.getTotalElements(); // total count
page.getTotalPages(); // total pagesKhi nào dùng CrudRepository: microservice nhẹ, không cần JPA-specific method, muốn tránh phụ thuộc JPA (có thể swap sang MongoDB).
Three interfaces in Spring Data hierarchy:
Repository (marker)
└── CrudRepository ← basic CRUD
└── PagingAndSortingRepository ← + pagination/sorting
└── JpaRepository ← + JPA-specific methodsCrudRepository — basic CRUD:
java
save(), findById(), findAll(), existsById(), deleteById(), count()PagingAndSortingRepository — adds:
java
findAll(Pageable pageable)
findAll(Sort sort)JpaRepository — adds JPA-specific:
java
saveAll(), saveAllAndFlush(), deleteAllInBatch()
getReferenceById() // lazy reference, no immediate DB hit
flush()java
// In practice: most repositories extend JpaRepository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
Page<User> findByActive(boolean active, Pageable pageable);
}
// Pagination:
Page<User> page = userRepo.findByActive(
true,
PageRequest.of(0, 20, Sort.by("createdAt").descending())
);
page.getContent(); // List<User>
page.getTotalElements(); // total count
page.getTotalPages(); // total pagesWhen to use CrudRepository: lightweight microservices, no JPA-specific methods needed, want to avoid JPA coupling (can swap to MongoDB).