我使用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
答案 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
。