Spring Data + QueryDSL空谓词+谓词链接

use*_*058 6 spring predicate querydsl

让我直截了当.我在一个项目中使用Spring Data JPA和QueryDSL,我自己也无法弄清楚这一点.

我在静态方法中有QueryDSL谓词可以接受参数,如果参数不正确,它应该返回"空谓词":

public static BooleanExpression byWhateverId(Long whateverId) {
  if(whateverId == null) return [insert magic here];
  // if parameter is OK return usual predicate
  return QClass.property.whateverId.eq(whateverId);
}
Run Code Online (Sandbox Code Playgroud)

现在我希望能够使用AND/OR操作符链接这些谓词:

someRepository.findAll(byWhateverId(someParam).and(bySomethingElseId(1));
Run Code Online (Sandbox Code Playgroud)

这里的问题是,此时我不知道'someParam'是否为空(当然我可以查看,但那是很多IF).我也知道我可以使用BooleanBuilder类,但这看起来也像很多不需要的代码.

有谁知道可以插入什么而不是"[在这里插入魔法]"??? 或者也许我在某处丢失某些东西......

谢谢!

Tim*_*per 13

您可以为非匹配谓词返回null byWhateverId,bySomethingElseId并组合谓词viaExpressionUtils.allOf()

在你的情况下

Predicate where = ExpressionUtils.allOf(byWhateverId(someParam), bySomethingElseId(1));
someRepository.findAll(where);
Run Code Online (Sandbox Code Playgroud)


use*_*058 7

抱歉,我完全忘记了这件事。正确的解决方案(从我的角度来看)是使用BooleanBuilder


小智 5

4岁的问题,但无论如何...

您可以返回始终为true的sql谓词,例如true = true:

public static BooleanExpression alwaysTrue() {
    return Expressions.asBoolean(true).isTrue();
}
Run Code Online (Sandbox Code Playgroud)

如果您有一堆,那么生成的sql就不会超级好用,因此您可能希望将此类用法限制在最低限度。