过滤来自QueryDSL搜索的结果

时间:2018-02-15 13:15:14

标签: spring-boot spring-data-rest querydsl

我使用QueryDSL作为Spring Data Rest的一部分来从我们的API中搜索实体。

是否有可能以某种方式过滤搜索API,因此默认情况下它不会找到例如“已停用”的Car实体?

目前我在汽车实体上有一个标志,当它设置为true时,它不应该通过我们的搜索API公开,并且具有此属性设置的汽车应该从搜索中省略。

https://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-safe

1 个答案:

答案 0 :(得分:3)

如果使用Spring Data REST和QueryDSL,要更改查询的标准行为,我们可以使用方面。

例如:默认情况下,我们只需要显示Model设置为flag的{​​{1}}个:

true

在这种情况下,我们实现这样的方面:

@Data
@NoArgsConstructor
@Entity
public class Model {

    @Id @GeneratedValue private Integer id;
    @NotBlank private String name;
    private boolean flag;
}

此方面拦截我们的repo的方法@Aspect @Component public class ModelRepoAspect { @Pointcut("execution(* com.example.ModelRepo.findAll(com.querydsl.core.types.Predicate, org.springframework.data.domain.Pageable))") public void modelFindAllWithPredicateAndPageable() { } @Around("modelFindAllWithPredicateAndPageable()") public Object filterModelsByFlag(final ProceedingJoinPoint pjp) throws Throwable { Object[] args = pjp.getArgs(); Predicate predicate = (Predicate) args[0]; BooleanExpression flagIsTrue = QModel.model.flag.eq(true); if (predicate == null) { args[0] = flagIsTrue; } else { if (!predicate.toString().contains("model.flag")) { args[0] = flagIsTrue.and(predicate); } } return pjp.proceed(args); } } 的所有调用,如果未设置请求参数(findAll(Predicate predicate, Pageable pageable)),或者如果他们没有设置,请将过滤器model.flag = true添加到查询中't'包含'flag'参数。否则aspect不会修改原始predicate == null