2014-11-23 177 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