Понимание разницы между CrudRepository и JpaRepository в данных Spring JPA

При работе с Spring Data JPA вы можете столкнуться с двумя часто используемыми интерфейсами: CrudRepository и JpaRepository. Оба интерфейса предоставляют возможность взаимодействия с базовой базой данных, но имеют некоторые различия с точки зрения функциональности и использования. В этой статье мы рассмотрим эти различия и приведем примеры кода, иллюстрирующие различные методы, доступные в каждом интерфейсе.

Интерфейс CrudRepository:
Интерфейс CrudRepository — это базовый интерфейс, предоставляемый Spring Data для основных операций CRUD (создание, чтение, обновление, удаление). Он предоставляет общие методы, которые можно использовать для взаимодействия с объектами базы данных. Вот некоторые часто используемые методы:

  1. save(entity): сохраняет заданный объект и возвращает сохраненный экземпляр.

    public interface CrudRepository<T, ID> {
    <S extends T> S save(S entity);
    }
  2. findById(id): извлекает объект по его идентификатору.

    public interface CrudRepository<T, ID> {
    Optional<T> findById(ID id);
    }
  3. findAll(): извлекает все объекты.

    public interface CrudRepository<T, ID> {
    Iterable<T> findAll();
    }
  4. delete(entity): удаляет указанный объект.

    public interface CrudRepository<T, ID> {
    void delete(T entity);
    }
  5. deleteById(id): удаляет объект с заданным идентификатором.

    public interface CrudRepository<T, ID> {
    void deleteById(ID id);
    }

Интерфейс JpaRepository:
Интерфейс JpaRepository расширяет интерфейс CrudRepository и предоставляет дополнительные методы для запроса и управления сущностями. Он основан на базовых операциях CRUD, добавляя более продвинутые возможности запросов. Вот некоторые часто используемые методы:

  1. save(entity): сохраняет заданный объект и возвращает сохраненный экземпляр.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    <S extends T> S save(S entity);
    }
  2. findById(id): извлекает объект по его идентификатору.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    Optional<T> findById(ID id);
    }
  3. findAll(): извлекает все объекты.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    List<T> findAll();
    }
  4. delete(entity): удаляет указанный объект.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    void delete(T entity);
    }
  5. deleteById(id): удаляет объект с заданным идентификатором.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    void deleteById(ID id);
    }
  6. findBy{PropertyName}(propertyValue): извлекает объекты на основе определенного значения свойства.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    List<T> findByFirstName(String firstName);
    }
  7. findBy{PropertyName}In(propertyValues): извлекает объекты, в коллекции которых содержится определенное значение свойства.

    public interface JpaRepository<T, ID> extends CrudRepository<T, ID> {
    List<T> findByAgeIn(List<Integer> ages);
    }

Подводя итог, можно сказать, что интерфейсы CrudRepository и JpaRepository предоставляют методы для основных операций CRUD. Однако JpaRepository расширяет CrudRepository и добавляет дополнительные возможности запросов, что делает его более мощным для сложного поиска данных. При работе с Spring Data JPA вы можете выбрать подходящий интерфейс исходя из ваших конкретных требований.

Понимая различия между CrudRepository и JpaRepository, вы сможете эффективно использовать их методы для взаимодействия с объектами вашей базы данных в приложении Spring Data JPA.