使用QuerydslBinderCustomizer的多个别名

问题描述 投票:0回答:1

我在我的RestController中使用QuerydslPredicate在一个有日期对象的实体上,我希望能够在给定日期之前/之后/之间查询日期,希望有类似的东西

  • GET / Problems?createdOnAfter = XXX
  • GET /问题?createdOnBefore = YYY
  • GET / Problems?createdOnAfter = XXX&createdOnBefore = YYY

我的实体有创建日期字段,我希望我可以使用多个别名自定义实体路径的绑定,即添加别名createdOnAfter&createdOnBefore - 看起来我不能创建多个别名,例如

@Repository
public interface ProblemRepository extends JpaRepository<Problem, String>, QueryDslPredicateExecutor<Problem>,
        QuerydslBinderCustomizer<QProblem> {

            ....

    @Override
    default void customize(QuerydslBindings bindings, QProblem root) {
        bindings.bind(root.createdOn).as("createdOnAfter").first(TemporalExpression::after);
        bindings.bind(root.createdOn).as("createdOnBefore").first(TemporalExpression::before);
    }
}

之前的别名显然会覆盖后者。

避免必须手动创建谓词的正确方法是什么?

spring spring-data-jpa querydsl spring-restcontroller
1个回答
2
投票

为什么不使用QueryDSL Predicate?你可以这样做:

@GetMapping("/problems")
@Timed
public ResponseEntity<List<ProblemDTO>> getAllProblems(
      @RequestParam(required = false) LocalDateTime createdOnAfter, 
      @RequestParam(required = false) LocalDateTime createdOnBefore,
      @ApiParam Pageable pageable) {
    BooleanBuilder where = new BooleanBuilder();
    if (startDate != null) {
        where = where.and(problem.createdOn.after(createdOnAfter));
    }
    if (endDate != null) {
        where = where.and(problem.createdOn.before(createdOnBefore));
    }
    Page<Donnee> page = problemRepository.findAll(where, pageable);
    return new ResponseEntity<>(problemMapper.toDTO(page.getContent())), null, HttpStatus.OK);
}

希望它有所帮助,问候

© www.soinside.com 2019 - 2024. All rights reserved.