spring-data как: пользовательский репозиторий, так и готовые опции

Я использую собственную реализацию/расширение репозитория Spring Data (один из примеров здесь), но я хотел бы по-прежнему использовать факультативы для основных операций — как показано ниже (пример для Mongo или Elasticsearch):

public interface DomainRepository extends MongoRepository<Domain, Long>, DomainRepositoryCustomAnyName {
    Optional<Domain> findOne(Long id);
}

Без необходимости самостоятельной реализации этого метода в моем классе DomainRepositoryImpl (который реализует DomainRepositoryCustomAnyName).

Это как-то возможно?

В настоящее время я получаю исключение (такое же, которое указывает, что я должен реализовать этот метод в своем классе DomainRepositoryImpl): Caused by: org.springframework.data.mapping.PropertyReferenceException: No property findOne found for type Domain


person m52509791    schedule 25.09.2017    source источник


Ответы (1)


Я столкнулся с той же проблемой, я думаю. Я использую не MongoDB, а PostgreSQL, но причина проблемы может быть той же. Пример на сайте, на который вы ссылаетесь, не использует findOne, поэтому я не уверен, откуда вы это взяли. Многие руководства предназначены для версий spring-data до 2.x.x. Дело в том, что интерфейсы и реализации репозиториев довольно сильно изменились с 1.11.8 до 2.0.0, поэтому ваша проблема может быть связана с проблемой версии.

Где-то в прошлом до 1.11.8 SimpleJpaRepository имел метод

public T findOne(ID id)

и поддержка упаковки, которая приводит к Optional. Это будет соответствовать вашему коду. Я проверил это, и это сработало для простого примера. Конечно у меня нет ваших доменных объектов и тд.

В версии 2.0.0 этот метод был удален из SimpleJpaRepository и заменен на

public <S extends T> Optional<S> findOne(Example<S> example)

а также

public Optional<T> findById(ID id)

Итак, если вы используете spring-data-jpa 2.x.x, у вас есть 3 варианта:

  1. Вернуться к версии 1.11.8

  2. Измените подпись метода на

    Optional<Domain> findOne(Example<Domain> ex);

  3. Вместо этого используйте новый метод:

    Optional<Domain> findById(Long id);

person Fencer    schedule 14.11.2017