我正在尝试使用QuerydslBinderCustomizer
在我的Rest控制器中执行@QuerydslPredicate
的使用。
我正在使用@Repositoy
实现来执行自定义查询,并与另一个表示查询访问级别的表联接。
遵循文档
包含QuerydslBinderCustomizer
的当前Spring JPA版本: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
}
}
资源方法调用:
@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版本有关吗?
详细信息:
这是使用Spring Boot项目的结果,已配置apt。 除此问题外,Querydsl当前正在按预期方式工作。
可以检查每种方法上的Predicates
并转换为类似方法(我不知道是否/可能),但即使有可能,听起来也不是一个好的解决方法。 / p>
文档: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 web query on the key of a Map field(无效,因为它使用的是Spring的早期版本) 编辑
似乎QuerydslBindingsFactory
仅在加载绑定接口。
我正在使用@NoRepositoryBean
的接口,该接口未在搜索自定义绑定的地图中列出。也许这是导致QuerydslBinderCustomizer
未被调用并添加到应用程序绑定的原因。
无论如何,我还是不知道该如何解决。
答案 0 :(得分:1)
似乎您只是忘记将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