java - 使用 OR 运算符代替 AND 的 QueryDSL

标签 java spring rest predicate querydsl

我需要一些有关 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/

相关文章:

java - 同步适配器中的 ContentResolver.requestSync 在 Android 中不起作用

java - Spring Data Rest - 在 Json 中禁用自链接(HAL)

security - API 安全问题 : SSL or more?

java - 如何知道一个项目是否是spring boot

spring - JsonParseException : Invalid JSON input. 位置 : 9. 字符: '.'

rest - 为什么Spring Security REST插件与JDK 1.6不兼容?

html - 在 RESTful html 应用程序中将表单/替代 View 放在哪里?

java - 为什么在构建器设计模式中使用嵌套类,为什么不能使用setter在同一个类中构建对象

java - 编译命令提示符时出现字符串args错误

java - 从 Javascript 调用 Applet 方法