Java 使用OR运算符而不是AND查询DSL

Java 使用OR运算符而不是AND查询DSL,java,spring,rest,predicate,querydsl,Java,Spring,Rest,Predicate,Querydsl,我需要一些关于QueryDSL库的帮助。更具体地说,我有: 我正在尝试创建一个搜索端点,使用户可以搜索具有特定功能(如名称、位置、所有者等)的已保存项目。。(可搜索字段是类变量) @GetMapping(value=“/search”,products=MediaTypes.HAL\u JSON\u value) PagedResources searchByQuery(最终可分页可分页, @RequestParam(value=“type”,required=false)最终列表类型筛选器,

我需要一些关于QueryDSL库的帮助。更具体地说,我有:

我正在尝试创建一个搜索端点,使用户可以搜索具有特定功能(如名称、位置、所有者等)的已保存项目。。(可搜索字段是类变量)

@GetMapping(value=“/search”,products=MediaTypes.HAL\u JSON\u value)
PagedResources searchByQuery(最终可分页可分页,
@RequestParam(value=“type”,required=false)最终列表类型筛选器,
@QuerydslPredicate(root=SavedItem.class)谓词(谓词){
返回pagedResourcesAssembler.toResource(service.findAll(谓词,可分页),汇编程序);
}
我定制了这样的绑定,以支持每个字段的值列表

 MultiValueBinding<StringPath, String> contains = (path, values) -> {
        BooleanBuilder predicate = new BooleanBuilder();
        for (String value : values) {
            predicate.or(path.containsIgnoreCase(value));
        }
        return predicate;
    };
MultiValueBinding包含=(路径,值)->{
BooleanBuilder谓词=新的BooleanBuilder();
for(字符串值:值){
谓词.or(path.containsSignoreCase(value));
}
返回谓词;
};
如果我只搜索一个字段,这会非常有效。但是当我在多个字段上搜索时,它不起作用,因为@querydspredicate将使用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;
}
公共静态谓词replaceAndForOR(谓词谓词){
if(谓词操作的谓词实例){
谓词操作操作=(谓词操作)谓词;

我放弃了,我自己写了一个问题。
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;
}