Метод findAll (Sort) в типе JpaRepository <Telefonbuch, Long> не применим для аргументов (спецификация <Telefonbuch>) - PullRequest
0 голосов
/ 09 января 2019

Я хочу реализовать Specifications и хочу использовать метод findAll(Specification<T> spec), но всегда, когда я вставляю спецификацию, Eclipse говорит мне:

The method findAll(Sort) in the type JpaRepository<Telefonbuch,Long> is not applicable for the arguments (Specification<Telefonbuch>)

Я не хочу использовать Sort. Я сдаю спецификацию, так почему он всегда пытается использовать метод с сортировкой?

Здесь вы можете видеть, что метод является предложением Eclipse: https://imgur.com/a/LuF6ZGK

Спецификация:

public interface Specification<T> {
    Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder);
}

TelefonbuchSpecifications:

public static Specification<Telefonbuch> hasVorname(String vorname) {
    return (root, query, cb) -> {
        return cb.equal(root.get(Telefonbuch_.vorname), "%"+vorname.toLowerCase()+"%");
    };
}

TelefonbuchRepository:

public interface TelefonbuchRepository extends JpaRepository<Telefonbuch, Long>, JpaSpecificationExecutor<Telefonbuch> {

SearchController:

public void search(String vorname, String nachname, String telefonnummer, String handynummer) {  
    if (!vorname.isEmpty()) {   
        List<Telefonbuch> list = telefonbuchRepository.findAll(TelefonbuchSpecifications.hasVorname(vorname));
    }

А вот у

List<Telefonbuch> list = telefonbuchRepository.findAll(TelefonbuchSpecifications.hasVorname(vorname));
        }

это говорит мне: The method findAll(Sort) in the type JpaRepository<Telefonbuch,Long> is not applicable for the arguments (Specification<Telefonbuch>)

Ответы [ 2 ]

0 голосов
/ 09 января 2019

В вашем хранилище дополнительно необходимо внедрить JpaSpecificationExecutor, чтобы увидеть метод findAll(Specification<T>).

Кроме того, обратите внимание, что мы не рекомендуем расширять JpaRepository, а использовать один из менее показательных интерфейсов CrudRepository или PagingAndSortingRepository. См. этот ответ для справки.

0 голосов
/ 09 января 2019

findAll делает именно то, что говорит: он находит все возможности. Поэтому то, что вы пытаетесь сделать, не имеет смысла (фильтрация по имени).

findAll в основном переводится как SELECT * FROM TABLE

Вам нужно будет объявить что-то в вашем репозитории, которое выполняет запрос, который вы ищете, который, я полагаю, равен SELECT * FROM TABLE WHERE <CONDITION>

В качестве примера, приведенного из , пружинные документы изображают в качестве руководства следующее:

Хранилище:

public interface PersonRepository extends Repository<User, Long> { 
    List<Person> findByLastname(String lastname);
}

Применение:

public class SomeClient {

  @Autowired
  private PersonRepository repository;

  public void doSomething() {
    List<Person> persons = repository.findByLastname("Matthews");
  }
}

Вам нужно будет определить запрос, который соответствует вашему необходимому условию, вместо того, чтобы пытаться форсировать условие на ярлыке findAll.

...