JpaSpecificationExecutor <T>не работает должным образом, как JpaRepository - PullRequest
0 голосов
/ 28 января 2020

Обычно при использовании интерфейса JpaRepository я склонен упоминать методы интерфейса, которые я буду использовать в своем классе обслуживания. Пример:

public interface UserRepository extends JpaRepository<User, Integer> {

    List<User> findAll(); // Usually I mention the methods this way in the interface.

}

И это прекрасно работает. Тем не менее, при использовании интерфейса JpaSpecificationExecutor, если я упоминаю методы в моем интерфейсе, он выдает ошибку вроде - не удалось создать метод запроса ....

Если я не упоминаю метод, он работает, как и ожидалось. Может кто-нибудь объяснить это странное поведение весной, пожалуйста?

public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {

    List<User> findAll(UserSpecification user); // If I do not mention this method here, it works perfectly.

}

1 Ответ

0 голосов
/ 29 января 2020
  1. List<User> findAll() объявлено в одном из расширенных интерфейсов (а именно JpaRepository<User, Integer>). Повторное объявление метода в расширяемом интерфейсе не является ошибкой, при условии, что подпись такая же; это просто не имеет никакого эффекта. Этот факт не имеет ничего общего с Spring Data; Это просто, как работает Java.

  2. List<User> findAll(UserSpecification) - это , а не , объявленный в любом из расширенных интерфейсов. Обратите внимание, что благодаря реализации JpaSpecificationExecutor<User> ваш интерфейс будет наследовать объявление метода с подписью List<User> findAll(Specification<User>), которая не совпадает с . Эти два метода имеют разные сигнатуры, поскольку Specification<User> отличается от типа UserSpecification.

  3. Конечно, вы можете добавить новые методы к интерфейсам репозитория , если они представляют простые запросы , без Specification аргументов, например, User findByName(String name) и Spring Данные автоматически генерируют реализации для этих методов во время выполнения

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

Со спецификациями вы должны использовать методы, предоставляемые JpaSpecificationExecutor. Я не понимаю, зачем вам такой метод, как List<User> findAll(UserSpecification user), - если UserSpecification расширяет Specification<User>, то унаследованный List<User> findAll(Specification<User>) будет работать просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...