我需要一些有关 QueryDSL 库的帮助。更具体地说,我有这个:
我正在尝试创建一个搜索端点,使用户能够搜索具有特定功能(如名称、位置、所有者等)的已保存项目。(可搜索字段是类变量)
@GetMapping(value = "/search", produces = MediaTypes.HAL_JSON_VALUE)
PagedResources<SavedItemResource> searchByQuery(final Pageable pageable,
@RequestParam(value = "type", required = false) final List<String> typeFilters,
@QuerydslPredicate(root = SavedItem.class) Predicate predicate) {
return pagedResourcesAssembler.toResource(service.findAll(predicate,pageable), assembler);
}
我像这样自定义了绑定(bind)以支持每个字段的值列表。
MultiValueBinding<StringPath, String> contains = (path, values) -> {
BooleanBuilder predicate = new BooleanBuilder();
for (String value : values) {
predicate.or(path.containsIgnoreCase(value));
}
return predicate;
};
如果我只搜索一个字段,这非常有效。但是,当我搜索多个字段时,它不起作用,因为 @QuerydslPredicate 将使用 AND 运算符创建谓词。但我需要不同字段之间的或。
有没有简单的方法可以做到这一点?提前谢谢!
最佳答案
您可以尝试此方法来创建一个新谓词来替换 OR 的 AND 运算符:
public static Predicate replaceAndForOR(Predicate predicate) {
if (predicate instanceof PredicateOperation) {
PredicateOperation operation = (PredicateOperation) predicate;
List<Expression<?>> expressions = operation.getArgs();
BooleanBuilder builder = new BooleanBuilder();
for (Expression<?> exp : expressions) {
String[] expStrings = exp.toString().split("&&");
PredicateOperation op = (PredicateOperation) exp;
if (expStrings.length > 1) {
Predicate p = replaceAndForOR(op);
builder.or(p);
} else {
builder.or(op);
}
}
return builder.getValue();
} else {
return predicate;
}
}
关于java - 使用 OR 运算符代替 AND 的 QueryDSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47346428/