让我直截了当。 我在一个项目中使用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);
}
现在我希望能够使用AND / OR操作符链接这些谓词:
someRepository.findAll(byWhateverId(someParam).and(bySomethingElseId(1));
这里的问题是,此时我不知道是否有一些问题。是否为空(当然我可以检查,但那是很多IF)。 我也知道我可以使用BooleanBuilder类,但这看起来也像很多不需要的代码。
有人知道可以插入什么而不是" [在这里插入魔法]" ??? 或许我在某处遗漏了某些东西......
谢谢!
答案 0 :(得分:8)
您可以在byWhateverId
和bySomethingElseId
中为非匹配谓词返回null,并通过ExpressionUtils.allOf()
在你的情况下
Predicate where = ExpressionUtils.allOf(byWhateverId(someParam), bySomethingElseId(1));
someRepository.findAll(where);
答案 1 :(得分:2)
对不起,我完全忘记了这一点。 正确的解决方案(从我的角度来看)是使用BooleanBuilder。
答案 2 :(得分:1)
4岁的问题,但无论如何...
您可以返回始终为true的sql谓词,例如true = true:
public static BooleanExpression alwaysTrue() {
return Expressions.asBoolean(true).isTrue();
}
如果有很多这样的代码,生成的sql不会超级好,所以您可能希望将此类用法限制到最小。