Я смотрю на Spring Data JPA. Рассмотрим приведенный ниже пример, где я получу все функции crud и finder, работающие по умолчанию, и если я захочу настроить finder, то это также легко сделать в самом интерфейсе.
@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("<JPQ statement here>")
List<Account> findByCustomer(Customer customer);
}
Я хотел бы знать, как я могу добавить полный пользовательский метод с его реализацией для вышеупомянутого AccountRepository? Поскольку это интерфейс, я не могу реализовать метод там.
java
spring-data
spring-data-jpa
Шарад Ядав
источник
источник
AccountRepositoryImpl
not:AccountRepositoryCustomImpl
и т. Д. - это очень строгое соглашение об именах.Error creating bean with name 'accountRepositoryImpl': Bean with name 'accountRepositoryImpl' has been injected into other beans [accountRepository] in its raw version as part of a circular reference, but has eventually been wrapped.
QueryDslRepositorySupport
Вы также должны внедрить репозиторий с помощью внедрения поля или метода установки, а не с помощью конструктора, иначе он не сможет создать компонент. Кажется, что это работает, но решение кажется немного «грязным», я не уверен, есть ли какие-либо планы по улучшению того, как это работает от команды Spring Data.В дополнение к axtavt в ответ , не забудьте , что вы можете вводить Entity менеджер в пользовательской реализации , если вам это нужно , чтобы построить свои запросы:
источник
Принятый ответ работает, но имеет три проблемы:
AccountRepositoryImpl
. В документации четко указано, что он должен быть вызванAccountRepositoryCustomImpl
, имя пользовательского интерфейса плюсImpl
@Autowired
если это считается плохой практикойЯ нашел способ сделать его идеальным, хотя не без использования другой недокументированной функции Spring Data:
источник
accountRepositoryBasic
). В противном случае весна жаловалась на то, что в моем*Impl
конструкторе есть 2 варианта бина для инъекций .AccountRepositoryBasic
иAccountRepositoryCustom
будут доступны через впрыскиваемогоAccountRepository
Это ограничено в использовании, но для простых пользовательских методов вы можете использовать методы интерфейса по умолчанию, такие как:
РЕДАКТИРОВАТЬ:
В этом весеннем уроке написано:
Так что даже можно просто объявить метод как:
и если object
Hobby
является свойством Customer, Spring автоматически определит метод для вас.источник
Я использую следующий код для доступа к сгенерированным методам поиска из моей пользовательской реализации. Получение реализации через фабрику компонентов предотвращает проблемы создания циклических компонентов.
источник
Как указано в документированной функциональности ,
Impl
суффикс позволяет нам иметь чистое решение:@Repository
интерфейсе, скажемMyEntityRepository
, методы Spring Data или пользовательские методы.MyEntityRepositoryImpl
(Impl
суффикс - это магия) где угодно (даже не обязательно находиться в одном пакете), который реализует пользовательские методы и комментируйте такой класс с помощью@Component
** (@Repository
не будет работать).MyEntityRepository
через@Autowired
для использования в пользовательских методах.Пример:
Класс сущности:
Интерфейс репозитория:
Пользовательские методы реализации bean:
Небольшие недостатки, которые я выявил:
Impl
классе помечены как неиспользуемые компилятором, таким образом,@SuppressWarnings("unused")
предложение.Impl
класс. (Принимая во внимание, что в реализации обычных интерфейсов фрагментов документы предполагают, что у вас может быть много.)источник
MyEntityRepository
, а не*Impl
.Если вы хотите иметь возможность выполнять более сложные операции, вам может потребоваться доступ к внутренним компонентам Spring Data, и в этом случае работает следующее (как мое временное решение для DATAJPA-422 ):
источник
Учитывая ваш фрагмент кода, обратите внимание, что вы можете передавать только собственные объекты в метод findBy ###, допустим, вы хотите загрузить список учетных записей, принадлежащих определенным клиентам, одно из решений состоит в том, чтобы сделать это,
Make sue - имя таблицы, к которой нужно обращаться, то же самое, что и класс Entity. Для дальнейших реализаций, пожалуйста, посмотрите на это
источник
Здесь стоит рассмотреть еще один вопрос. Некоторые люди ожидают, что добавление пользовательского метода в ваш репозиторий автоматически представит их как службы REST по ссылке / search. Это, к сожалению, не тот случай. Spring не поддерживает это в настоящее время.
Это особенность «по замыслу», данные пружины явно проверяют, является ли метод пользовательским методом, и не отображают его как поисковую ссылку REST:
Это цитата из Оливера Гирке:
Для получения дополнительной информации см. Эту проблему: https://jira.spring.io/browse/DATAREST-206
источник
@RestResource(path = "myQueryMethod")
аннотацию к методу. Приведенная выше цитата просто говорит о том, что Spring не знает, как вы хотите, чтобы он отображался (то есть GET против POST и т. Д.), Поэтому вы можете указать это с помощью аннотации.Добавление пользовательского поведения во все репозитории:
Чтобы добавить пользовательское поведение ко всем репозиториям, вы сначала добавляете промежуточный интерфейс для объявления общего поведения.
Теперь ваши отдельные интерфейсы репозитория расширят этот промежуточный интерфейс вместо интерфейса репозитория, чтобы включить объявленную функциональность.
Затем создайте реализацию промежуточного интерфейса, который расширяет базовый класс репозитория персистентной технологии. Затем этот класс будет действовать как пользовательский базовый класс для прокси-серверов репозитория.
Репозитории данных Spring, часть I.
источник
Я расширяю SimpleJpaRepository:
и добавляет этот класс в @EnableJpaRepositoryries repositoryBaseClass.
источник