2011-09-08 51 views
1

我不知道是否有一個很好的解決方案來建立一個基於過濾器的JPQL查詢(我的查詢太「表現力」,我不能使用Criteria)。如何在參數動態時構建JPQL查詢?

喜歡的東西:

query = "Select from Ent" 
if(parameter!=null){ 
    query += "WHERE field=:parameter" 
} 
if(parameter2!=null) { 
    query += "WHERE field2=:parameter2" 
} 

,但我會寫到哪兩次!隨着參數數量的增加,casuistic會爆炸。因爲最終沒有或全部可能爲空。

任何提示基於正確的方式構建這些基於過濾器的查詢?

回答

3

爲什麼不能使用標準like this

其他選項(不太好的恕我直言):

創建兩個named queries一個爲每個條件,然後調用相應的查詢。

或者建立一個字符串並使用native query

哦,你剛纔的意思是串成形(?):

query = "Select from Ent where 1=1 " 
if(parameter!=null){ 
    query += " and field=:parameter" 
} 
if(parameter2!=null) { 
    query += " and field2=:parameter2" 
} 

(我認爲這串成形是醜陋的,但它似乎被什麼要求)

+0

謝謝您!但有時我必須應用過濾器(當它不是空的時候),有時候不需要。如此命名的查詢並不能解決問題,原生查詢也可以...... – edutesoy

+1

+1。標準API是動態構建查詢的途徑。這就是這個API的重點。 –

+0

@edutesoy。,我不明白爲什麼解決方案不適合你的情況。 – NimChimpsky

2
select * from Ent  
    where (field1 = :parameter1 or :parameter1 is null)  
    and (field2 = :parameter2 or :parameter2 is null)