Существуют разные способы, которыми Spring Data позволяет вам определять методы запросов. Упорядочено по объему работы, которую вы должны выполнить (а также по гибкости, которую вы получаете):
Предопределенные методы. В зависимости от того, какой интерфейс вы выберете в качестве основы своего репозитория, вы получите множество методов бесплатно: те, которые объявлены в интерфейсе. Вы можете выбрать CrudRepository
, PagingAndSortingRepository
, JpaRepository
, QueryByExampleExecutor
и JpaSpecificationExecutor
. Методы этих интерфейсов реализованы в классах, которые являются частью Spring Data. Например, в SimpleJpaRepository
.
Вывод запроса. Здесь вы можете просто объявить метод с определенной схемой именования c. Spring Data проанализирует имя метода, сформирует запрос из этого, свяжет ваши аргументы и выполнит его. Запрос создается с использованием API критериев Jpa.
Аннотация запроса / Именованные запросы. Вы можете предоставить запрос самостоятельно, добавив аннотацию @Query
или объявив именованный запрос для объекта или поместив его в файл свойств. Spring Data найдет его и выполнит. Он также добавит изящные вещи для добавления нумерации страниц и обработает ваши аргументы через SpEL, если вы решите их использовать.
Наконец, вы можете предоставить свою собственную реализацию, где вы могли бы сделать что когда-либо Java позволяет вам делать: запрашивать базу данных, используя EntityManager
или JdbcTemplate
, вообще не обращаясь к базе данных, но делая что-то совершенно другое.
В общем все работает так: если в репозиторий нужно вставить Spring Data создает прокси, реализующий все методы, объявленные в вашем репозитории. В этом прокси Spring Data проанализирует вызов метода, решит, какой из приведенных выше случаев применим, и выполнит его. На самом деле решение о том, какой процесс использовать, выполняется при запуске, но это не должно иметь значения для его понимания.
Все эти стратегии реализации метода не зависят друг от друга, поэтому вы можете использовать разные стратегии для каждого метод в репозитории.