Как использовать Спецификацию в JPA - PullRequest
0 голосов
/ 25 июня 2019

В моем приложении реализована функция поиска. Я использую спецификацию в findAll(), и она работает отлично. Но когда я пытаюсь достичь других методов, таких как findByFirstName(), это не работает

Я включаю то, что я сделал до сих пор.

AircraftSpecification.java

public class AircraftSpecification {

    private AircraftSpecification() {}

    public static Specification<Aircraft> textInAllColumns(String text) {

        if (!text.contains("%")) {
            text = "%"+text+"%";
        }
        final String finalText = text;

        return new Specification<Aircraft>() {
            private static final long serialVersionUID = 1L;

            @Override
            public Predicate toPredicate(Root<Aircraft> root, CriteriaQuery<?> cq, CriteriaBuilder builder) {
                  List<SingularAttribute<Aircraft, ?>> tempAttributes = new ArrayList<>();
                  for (SingularAttribute<Aircraft, ?> attribute : root.getModel().getDeclaredSingularAttributes()) {
                      if (attribute.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                          tempAttributes.add(attribute);
                      }
                  }

                  final Predicate[] predicates = new Predicate[tempAttributes.size()];

                  for (int i = 0; i < tempAttributes.size(); i++) {
                      predicates[i] = builder.like(builder.lower(root.get(tempAttributes.get(i).getName())), finalText.toLowerCase());
                  }
                  return builder.or(predicates);
              }
        };
    }
}

Когда я звоню

aircraftRepository.findAll(Specification.where(AircraftSpecification.textInAllColumns(searchText)));

это дает мне правильные данные.

Но когда я звоню

aircraftRepository.findAllByName(name, Specification.where(AircraftSpecification.textInAllColumns(searchText)));

Это исключение.

Исключение составляет:

org.springframework.dao.InvalidDataAccessApiUsageException: At least 2 parameter(s) provided but only 1 parameter(s) present in query.; nested exception is java.lang.IllegalArgumentException: At least 2 parameter(s) provided but only 1 parameter(s) present in query.

Может ли кто-нибудь помочь мне, как использовать спецификацию, кроме метода findAll.

1 Ответ

1 голос
/ 26 июня 2019

Невозможно объединить производные запросы, когда Spring Data выводит запрос для выполнения из имени метода с Specification. Просто сделайте имя частью запроса Specification и объедините их с и.

Получившийся вызов может выглядеть примерно так:

aircraftRepository.findAll(
        byName("Alfred")
       .and(textInAllColumns(searchText))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...