代码之家  ›  专栏  ›  技术社区  ›  Bacon

使用QuerydslBinderCustomizer的多个别名

  •  2
  • Bacon  · 技术社区  · 7 年前

    我在RestController中使用querydsldpredicate处理一个具有日期对象的实体,我希望能够查询给定日期之前/之后/之间的日期,希望有类似的结果

    • 获取/问题?createdOnAfter=XXX
    • 获取/问题?createdOnBefore=YYY
    • 获取/问题?createdOnAfter=XXX&createdOnBefore=YYY

    我的实体具有日期字段 createdOn公司 我希望可以使用多个别名为实体路径定制绑定,即添加别名 createdOnAfter创建 & 在之前创建 -但看起来我无法创建多个别名,例如。

    @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);
        }
    }
    

    before别名显然覆盖了after别名。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   teikitel    7 年前

    为什么不使用QueryDSL谓词?你可以做:

    @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);
    }
    

    希望有帮助, 当做