Я пытаюсь использовать 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
не вызывается и не добавляется в привязки приложений.
Во всяком случае, я до сих пор не знаю, как это исправить.