Spring Data Jpa - Тип Specifications‹T› устарел

Я реализую логику из ссылки: Spring Data - поиск по нескольким столбцам где я ищу поиск по FirstName.

По ссылке: https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/Specifications.html

EmployeeSpecification.java

public class EmployeeSpecification {
    public static Specification<Employee> textInAllColumns(String text) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return new Specification<Employee>() {
            @Override
            public Predicate toPredicate(Root<Employee> root, CriteriaQuery<Employee> cq, CriteriaBuilder builder) {
                return builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                    if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                        return true;
                    } else {
                        return false;
                    }
                }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
            }
        };
    }
}

EmployeeRepository.java

public interface EmployeeRepository extends JpaRepository<Employee, Long>{
    List<Employee> findAll(Specification<Employee> spec);
}

СотрудникServiceImpl.java

@Service
@Slf4j
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeRepository employeeRepository;

    @Override
    public void findAllCustomersByFirstName(String firstName) {
        employeeRepository.findAll(Specifications.where(EmployeeSpecification.textInAllColumns(firstName)));
    }
}

Ошибка:

Несколько маркеров в этой строке - Метод where(Specification) в Спецификациях типа неприменим для аргументов (Specification) - Спецификации типа устарели

введите здесь описание изображения


person Pra_A    schedule 19.07.2019    source источник


Ответы (1)


Ваш код репо должен расширять JpaSpecificationExecutor следующим образом:

public interface EmployeeRepository extends JpaRepository<Employee, Long>, 
    JpaSpecificationExecutor<Employee> {
}

JpaSpeficationExecutor имеет те методы, которые можно вызвать:

public interface JpaSpecificationExecutor<T> {
    Optional<T> findOne(@Nullable Specification<T> var1);

    List<T> findAll(@Nullable Specification<T> var1);

    Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

    List<T> findAll(@Nullable Specification<T> var1, Sort var2);

    long count(@Nullable Specification<T> var1);
}

Затем вы можете сделать:

public void findAllCustomersByFirstName(String firstName) {
    employeeRepository.findAll(
            EmployeeSpecification.textInAllColumns(firstName)
    );
}

Я изменил ваши спецификации, чтобы использовать лямбды:

public class EmployeeSpecification {
    public static Specification<Employee> textInAllColumns(String text) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return  (Specification<Employee>) (root, query, builder) -> 
                builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                    return true;
                } else {
                    return false;
                }
            }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
    }
}

Вы можете посмотреть здесь обновленную версию кода, который у вас есть в вашем ответе: main/java/springboot/rest/specifications/CustomSpecifications.java#L172" rel="nofollow noreferrer">https://github.com/zifnab87/spring-boot-rest-api-helpers/blob/26501c1d6afcd6afa8ea43c121898db85b4e5dbe/src/main /java/springboot/остальные/спецификации/CustomSpecifications.java#L172

person Michail Michailidis    schedule 19.07.2019
comment
Спасибо. Нужна ли нам действительно каста типов (Specification<Employee>)? Кроме того, можем ли мы заменить этот оператор if-then-else одним оператором return. - person Pra_A; 21.07.2019
comment
Как включить в поиск несколько столбцов БД (или параметров)? - person Pra_A; 21.07.2019
comment
Я думаю, что я провел рефакторинг кода в репозитории, который я связал.. вы также можете видеть, что я беру список столбцов для поиска в примере - person Michail Michailidis; 21.07.2019
comment
@Michali - Согласитесь, я уже прошел через это, в вашем коде так много всего. Поможете ли вы создать упрощенный с Date (отсутствует в вашем коде), Integer и String ? - person Pra_A; 22.07.2019
comment
@PAA, это оффтоп, основанный на этом вопросе - я могу добавить некоторый код в предыдущий вопрос, который более связан - person Michail Michailidis; 22.07.2019
comment
@PAA stackoverflow.com/a/46302324/986160 проверьте это внизу - person Michail Michailidis; 22.07.2019