Реализовать интерфейс JpaRepository с пользовательским методом - PullRequest
1 голос
/ 16 января 2020

Я новичок в Spring Boot, поэтому у меня есть пара базовых c вопросов.

Когда мы определяем интерфейс репозитория , который расширяет JpaRepository

@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {
    Optional<UserInfo> findByEmail(String email);   
    List<UserInfo> findAllByEmail(String email);
}

Эти методы можно вызывать из Класс обслуживания (нам, вероятно, даже не нужно упоминать эти два метода). Пока все хорошо.

Вопросы:

  1. Как определяется метод findByEmail? И как это называется за кулисами?

  2. Что если мы хотим добавить пользовательский метод findUserAction с собственным SQL? В этом случае нам нужно объявить его в interface UserInfoRepository и определить его в UserInfoRepositoryImpl классе. В таком случае, не нужно ли нам определять и другие существующие методы?

Буду признателен за любую помощь. Заранее спасибо! :)

1 Ответ

4 голосов
/ 16 января 2020

Существуют разные способы, которыми Spring Data позволяет вам определять методы запросов. Упорядочено по объему работы, которую вы должны выполнить (а также по гибкости, которую вы получаете):

  1. Предопределенные методы. В зависимости от того, какой интерфейс вы выберете в качестве основы своего репозитория, вы получите множество методов бесплатно: те, которые объявлены в интерфейсе. Вы можете выбрать CrudRepository, PagingAndSortingRepository, JpaRepository, QueryByExampleExecutor и JpaSpecificationExecutor. Методы этих интерфейсов реализованы в классах, которые являются частью Spring Data. Например, в SimpleJpaRepository.

  2. Вывод запроса. Здесь вы можете просто объявить метод с определенной схемой именования c. Spring Data проанализирует имя метода, сформирует запрос из этого, свяжет ваши аргументы и выполнит его. Запрос создается с использованием API критериев Jpa.

  3. Аннотация запроса / Именованные запросы. Вы можете предоставить запрос самостоятельно, добавив аннотацию @Query или объявив именованный запрос для объекта или поместив его в файл свойств. Spring Data найдет его и выполнит. Он также добавит изящные вещи для добавления нумерации страниц и обработает ваши аргументы через SpEL, если вы решите их использовать.

  4. Наконец, вы можете предоставить свою собственную реализацию, где вы могли бы сделать что когда-либо Java позволяет вам делать: запрашивать базу данных, используя EntityManager или JdbcTemplate, вообще не обращаясь к базе данных, но делая что-то совершенно другое.

В общем все работает так: если в репозиторий нужно вставить Spring Data создает прокси, реализующий все методы, объявленные в вашем репозитории. В этом прокси Spring Data проанализирует вызов метода, решит, какой из приведенных выше случаев применим, и выполнит его. На самом деле решение о том, какой процесс использовать, выполняется при запуске, но это не должно иметь значения для его понимания.

Все эти стратегии реализации метода не зависят друг от друга, поэтому вы можете использовать разные стратегии для каждого метод в репозитории.

...