2016-03-11 130 views
1

我想綁定多個參數與此查詢動態,綁定多個參數與Hibernate查詢

Query selectList = session.createSQLQuery("select * from Txn where recNo =: recNo") 
.addEntity(Txn.class); 

selectist.setParameter("recNo",recNo);  
selectTxnList.setFirstResult(startRowNo);   
selectTxnList.setMaxResults(scrollValue); 

List list = selectTxnList.list(); 

假設我在這裏檢查,如果我有txnNo不爲空的話,我想這個參數也結合此查詢

示例 - select * from Txn其中recNo = 123 txnNo = txnNo;

如果我在txnNo中有null,那麼我只想綁定recNo與這個查詢。

示例 - select * from Txn其中recNo = 123;

請告訴我,如果我可以在HQL的幫助下做到這一點,因爲我有超過50個參數。我不想增加參數的查詢(從事務處理選擇*其中RECNO =:RECNO )

+1

在Java邏輯中使用'if'語句來處理這個問題會有什麼問題嗎? –

+0

沒有什麼是錯的,但我們應該怎樣處理查詢(select * from Txn where recNo =:recNo)我該如何增加參數?如果可以將其轉換爲HQL查詢,則不存在任何問題。但我該怎麼做 –

回答

1

這裏是你必須處理查詢本身這裏面的邏輯一個選項:

String query = "select * from Txn where recNo = :recNo and "; 
     query += "(case when :txnNo is not null then txnNo = :txnNo else true end)"; 

這隻有在不是NULL的情況下,纔會在txnNo上執行相等,否則該參數將被忽略。

但我寧願通過在Java邏輯中使用if語句來處理您的情況,而不是使用此查詢。

更新:

另一種選擇是使用下面的語句爲每個50列:

where (col = :col or col is null) 

這種情況將觸發真當colNULL和匹配記錄,並且當colNULL時(這種情況下,對於大多數RDBMS,等式應該估計爲NULL),它也將消失。

通常,如果您希望WHERE子句的整個部分有條件地出現在查詢中,那麼您需要動態SQL。在Java和Hibernate的上下文中,這意味着在應用程序層中形成查詢字符串。

+0

是的,這不會有效,因爲我的查詢中有超過50個參數。請告訴我,如果我可以使用HQL –

+0

@LokeshRathor處理這種情況,我更新了我的答案,請看看。 –