QuerydslBinderCustomizer 的多个别名
Multiple aliases with QuerydslBinderCustomizer
我在我的 RestController 中对一个有日期对象的实体使用 QuerydslPredicate,我希望能够查询给定日期 before/after/between 的日期,希望有类似
的东西
- GET /problems?createdOnAfter=XXX
- GET /problems?createdOnBefore=YYY
- GET /problems?createdOnAfter=XXX&createdOnBefore=YYY
我的实体有日期字段 createdOn 我希望我可以使用多个别名为实体路径自定义绑定,即添加别名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);
}
}
前面的别名明显覆盖了后面的。
避免手动创建谓词的正确方法是什么?
为什么不使用 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);
}
希望对您有所帮助,
此致
我在我的 RestController 中对一个有日期对象的实体使用 QuerydslPredicate,我希望能够查询给定日期 before/after/between 的日期,希望有类似
的东西- GET /problems?createdOnAfter=XXX
- GET /problems?createdOnBefore=YYY
- GET /problems?createdOnAfter=XXX&createdOnBefore=YYY
我的实体有日期字段 createdOn 我希望我可以使用多个别名为实体路径自定义绑定,即添加别名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);
}
}
前面的别名明显覆盖了后面的。
避免手动创建谓词的正确方法是什么?
为什么不使用 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);
}
希望对您有所帮助, 此致