QuerydslBinderCustomizer не работает в Spring Data JPA 2.0.7 - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь использовать QuerydslBinderCustomizer для использования @QuerydslPredicate в моем контроллере Rest.

Я использую реализацию @Repositoy для выполнения пользовательских запросов и объединяюсь с другими таблицами, представляющими уровень доступа для запроса.

Согласно документации

Текущая версия JPA Spring, которая содержит QuerydslBinderCustomizer: spring-data-commons-2.0.7.RELEASE.jar

Проблема:

Я пытаюсь применить операцию like() в поле serviceExecution.code, но я получаю предикат только на основе eq(), а метод customize вообще не вызывается.

Я также пытаюсь поместить код в интерфейс на основе Repository, но безуспешно.

Вот реализация Repository:

@Repository 
public class ServiceExecutionQueryRepositoryImpl extends JpaQuerydslBaseRepository<Long, ServiceExecution> implements ServiceExecutionQueryRepository, QuerydslBinderCustomizer<QServiceExecution>, QuerydslPredicateExecutor<ServiceExecution> {

    @Override
    public void customize(QuerydslBindings bindings, QServiceExecution serviceExecution) {

        bindings.bind(serviceExecution.code).first((path, value) -> path.likeIgnoreCase(StringUtils.like(value)));
        // breakpoint never hit this method.
        // bindings is not applied to the query
        ... another bindings

    }
}

Вызов метода Resource:

    @GetMapping("/service-executions")
    public ResponseEntity<Page<ServiceExecutionDTO>> getAllServiceExecutions(
        @RequestParam(required = false) MultiValueMap<String, String> parameters,
        @QuerydslPredicate(root = ServiceExecution.class) Predicate predicate, Pageable pageable) {
        Page<ServiceExecutionDTO> page = facade.findAll(parameters, predicate, pageable);
        return new ResponseEntity<>(page, HttpStatus.OK);
    }

Результирующий сгенерированный запрос (видимый в журналах приложений) всегда такой (включая запрос количества):

select o from ... where code = ?

Может кто-нибудь знает, что я могу упустить? Что-то связано с последней версией Spring Data JPA?

подробности:

Это проект с использованием gradle для Spring Boot, apt настроен. За исключением этой проблемы, Querydsl в настоящее время работает должным образом.

Можно ОК проверить Predicates для каждого метода и преобразовать в подобное (я не знаю, возможно ли / знаю, возможно ли это), но даже если это возможно, это не похоже на хороший обходной путь.

Документы: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web.binding

Один из руководств, которым я следовал: https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling

Аналогичный вопрос: Spring @QuerydslPredicate Questions

Веб-запрос QueryDsl по ключу поля карты (недопустимо, поскольку используется предыдущая версия spring) EDIT

Похоже, что QuerydslBindingsFactory загружает только интерфейсы для привязок.

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

Во всяком случае, я до сих пор не знаю, как это исправить.

1 Ответ

0 голосов
/ 30 июня 2018

Кажется, вы просто забыли добавить свой ServiceExecutionQueryRepositoryImpl как bindings параметр @QuerydslPredicate аннотации:

@GetMapping("/service-executions")
public ResponseEntity<Page<ServiceExecutionDTO>> getAllServiceExecutions(
    @RequestParam(required = false) MultiValueMap<String, String> parameters,
    @QuerydslPredicate(root = ServiceExecution.class, bindings = ServiceExecutionQueryRepositoryImpl.class) Predicate predicate, 
    Pageable pageable
) {
    Page<ServiceExecutionDTO> page = facade.findAll(parameters, predicate, pageable);
    return new ResponseEntity<>(page, HttpStatus.OK);
}

См. Пример для примера: sb-querydsl-sd-demo

...