亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 Native Query 通過多個參數的組合進行搜索

通過 Native Query 通過多個參數的組合進行搜索

慕尼黑5688855 2021-09-03 22:02:03
我目前正在開發一個功能,它允許系統通過 6 個參數的組合來搜索公共服務收據,這些參數可以為空,這意味著收據不應被此參數過濾:accountNumber、amountRangeMin、amountRangeMax、dateRangeMin、dateRangeMax,公共服務標識。然而,為每個參數組合制定一個方法不是一種選擇,我認為必須有更好的方法,起初我的方法如下:在我的服務中,我有這個方法:public Map<String,Object> findPublicServiceReceiptsByParams(Integer accountNumber, BigDecimal amountRangeMin,        BigDecimal amountRangeMax, LocalDate dateRangeMin, LocalDate dateRangeMax, Integer publicServiceId) {    Map<String,Object> publicServiceReceipts = new HashMap<String,Object>();    String accountNumberFilter = !(accountNumber==null) ? accountNumber.toString() : "AccountNumberTableName";    String amountRangeMinFilter = !(amountRangeMin==null) ? amountRangeMin.toString() : "table.AmountColumnName";    String amountRangeMaxFilter = !(amountRangeMax==null) ? amountRangeMax.toString() : "table.AmountColumnName";    String dateRangeMinFilter = !(dateRangeMin==null) ? dateRangeMin.toString() : "Table.ReceiptCreationDateColumn";    String dateRangeMaxFilter = !(dateRangeMax==null) ? dateRangeMax.toString() : "Table.ReceiptCreationDateColumn";    String publicServiceIdFilter = !(publicServiceId==null) ? publicServiceId.toString() : "table.publicServiceIdColumn";    publicServiceReceipts = publicServiceReceiptRepository.findPublicServiceReceiptsByParams(accountNumberFilter,            amountRangeMinFilter, amountRangeMaxFilter, dateRangeMinFilter, dateRangeMaxFilter,            publicServiceIdFilter);    return publicServiceReceipts;}我的推理是,如果參數為空意味著使用 Web 服務的人對該參數不感興趣,因此如果發生這種情況,我將該變量設置為列名,這樣它就不會影響 WHERE 子句,并且理論上使它成為更簡單,但我發現它會將名稱作為字符串發送,因此它不會被識別為 sql 語句,這是我思想中的缺陷,正如我所說,除了為每個組合編寫每個方法之外,必須有另一種方式,我感謝任何幫助:)。
查看完整描述

2 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

我找到了解決此問題的方法,我是這樣做的(我將僅顯示本機查詢,因為它是我唯一更改的內容):


DECLARE  @actNum varchar(50),@crdNum varchar(50),@pseId varchar(50),@dateMin varchar(50),@dateMax varchar(50),@amountMin varchar(50),@amountMax varchar(50)

SET @actNum = :actNum

SET @crdNum = :crdNum 

SET @pseId =  :pseId 

SET @dateMin = :dateMin 

SET @dateMax = :dateMax 

SET @amountMin = :amountMin 

SET @amountMax = :amountMax 

--Whatever Select with joins statement

                   WHERE ACT.ACT_AccountNumber = CASE WHEN @actNum = 'N/A' 

                                             THEN ACT.ACT_AccountNumber 

                                             ELSE @actNum END

                 AND CRD_CardNumber = CASE WHEN @crdNum = 'N/A' 

                                      THEN CRD_CardNumber 

                                      ELSE @crdNum END

                 AND PSE.PSE_Id= CASE WHEN @pseId = 'N/A' 

                                 THEN PSE.PSE_Id 

                                 ELSE @pseId END

                 AND PSR.PSR_CreateDate >= CASE WHEN @dateMin = 'N/A' 

                                                THEN PSR.PSR_CreateDate 

                                                ELSE @dateMin END 

                                        AND PSR.PSR_CreateDate <= CASE WHEN @dateMax = 'N/A' 

                                            THEN PSR.PSR_CreateDate 

                                            ELSE @dateMax END

                 AND PSR.PSR_Amount BETWEEN CASE WHEN @amountMin = 'N/A' 

                                            THEN PSR.PSR_Amount 

                                            ELSE @amountMin END 

                                    AND CASE WHEN @amountMax = 'N/A' 

                                        THEN PSR.PSR_Amount 

                                        ELSE @amountMax END 

            ORDER BY PSR.PSR_CreateDate DESC

后端會將參數作為“N/A”(如果不應該用于過濾數據)或實際值發送,這對我來說很好用!


查看完整回答
反對 回復 2021-09-03
  • 2 回答
  • 0 關注
  • 318 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號