2014-11-23 147 views
3

让我直截了当。 我在一个项目中使用Spring Data JPA和QueryDSL,我无法自己弄清楚这一点。Spring Data + 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 oprators:

someRepository.findAll(byWhateverId(someParam).and(bySomethingElseId(1)); 

这里的问题是,在这一点上我不知道“someParam”是否为空或不是(当然,我可以检查,但是这是一个很大的IF)。 我也知道我可以使用BooleanBuilder类,但看起来也像很多不应该需要的代码。

有谁知道可以插入什么而不是“[在此插入魔术]”? 或者我错过了某个地方的东西.​​..

谢谢!

回答

8

可以在byWhateverIdbySomethingElseId非匹配谓词返回null,并通过ExpressionUtils.allOf()

结合谓语在你的情况

Predicate where = ExpressionUtils.allOf(byWhateverId(someParam), bySomethingElseId(1)); 
someRepository.findAll(where); 
+0

感谢您的答复。 这看起来相当不错,但我仍然想要链接,没有任何额外的成本(如使用ExpressionUtils)。此解决方案基本上与BooleanBuilder相同。我真的很喜欢WhateverId(1).and(bySomethingElseId(1))的方式。 但也许我在这件事上太严格了,我应该接受这个:) – user1622058 2014-11-24 10:00:49