JPA Repository vs CRUD Repository
JPA Repository
JpaRepository is a part of the Spring Data JPA library, which is an extension of the CrudRepository interface. It provides JPA-related methods such as flushing the persistence context and delete operations that leverage the EntityManager’s delete methods. Additionally, it supports batch deletes, batch inserts, and pagination and sorting out of the box.

Table of Contents
CRUD Repository
CrudRepository is a Spring Data interface for generic CRUD (Create, Read, Update, Delete) operations on a repository for a specific type. It provides methods such as save, findOne, findAll, count, delete, etc. This interface is very basic and provides the most fundamental operations.
Detailed Differences
- 1. Â Inheritance Hierarchy :
- CrudRepository is a parent interface.
- JpaRepository extends CrudRepository.
- 2. Â Functionality :
- CrudRepository offers basic CRUD functionalities.
- JpaRepository offers all CrudRepository functionalities and adds JPA-specific operations like flushing the persistence context and batch operations.
- 3. Â Pagination and Sorting :
- CrudRepository does not directly support pagination and sorting.
- JpaRepository provides built-in support for pagination and sorting.
- 4. Â Additional JPA-Specific Methods :
- JpaRepository includes methods like findAll(Sort sort), findAll(Pageable pageable), saveAndFlush, and deleteInBatch.
Example in Java
Let’s create an example to illustrate the difference between JpaRepository and CrudRepository.
java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
java
import org.springframework.data.repository.CrudRepository;
public interface UserCrudRepository extends CrudRepository<User, Long> {
// Custom query methods can be defined here
}
java
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserJpaRepository extends JpaRepository<User, Long> {
// Custom query methods can be defined here
}
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserCrudRepository userCrudRepository;
@Autowired
private UserJpaRepository userJpaRepository;
public void crudRepositoryExample() {
// Using CrudRepository methods
User user = new User();
user.setName("John Doe");
userCrudRepository.save(user);
Iterable<User> users = userCrudRepository.findAll();
users.forEach(u -> System.out.println(u.getName()));
}
public void jpaRepositoryExample() {
// Using JpaRepository methods
User user = new User();
user.setName("Jane Doe");
userJpaRepository.saveAndFlush(user);
List<User> users = userJpaRepository.findAll();
users.forEach(u -> System.out.println(u.getName()));
List<User> sortedUsers = userJpaRepository.findAll(Sort.by(Sort.Direction.ASC, "name"));
sortedUsers.forEach(u -> System.out.println(u.getName()));
}
}
In this example, the UserService class demonstrates how to use both CrudRepository and JpaRepository. The crudRepositoryExample method uses basic CRUD operations, while the jpaRepositoryExample method uses additional JPA-specific operations provided by JpaRepository.