2011-05-18 45 views
0

我有一些數據庫表,比如說CarTb,以及可以讓您瀏覽可供出售的二手車的前端。向存儲過程提供可變數量的參數/ SQL

在前端,我可以儘可能少或儘可能多地過濾 - 向我展示所有藍色汽車,向我展示帶有4扇門的所有紅色汽車,向我展示帶有rego號碼XXX123或iPod功能的所有汽車以及五個揚聲器音響。等

我想在Java後端能夠做的是建立一個系統,根據UI發送給我的數據動態地查詢數據庫。我想知道是否有可能動態地將一串參數動態注入到存儲過程中...顯然,我知道你可以映射單個參數,如門=?和顏色=?然後替換值...但是,變量的爭論怎麼樣,幾乎像Java vargs我想的那樣。

你永遠是做一個SELECT * FROM CarTb,它只是在where子句可以是下列任何...

  • WHERE門= 4
  • WHERE門= 5,顏色=紅色和MP3 = Y
  • WHERE渦輪= Y或吹= Y

你的想法。

有什麼建議嗎?如果有幫助,我們確實可以訪問hibernate,而sybase數據庫(如果需要,我們可以編寫另一個存儲過程來執行此操作)。

--Cheers,戴夫

+0

您是否有權訪問數據庫(例如,您可以編寫存儲過程),還是僅限於使用Java? – 2011-05-18 16:17:26

+0

是的...我編輯了原來的問題,以反映如此。 – f1dave 2011-05-18 16:23:30

回答

0

您可以動態建立查詢,但仍然有doors=:param。例如:

if (doorsSelected) { 
    clauses.add("doors=:doors"); 
    paramNames.add("doors"); 
    values.add(doors); 
} 

if (engineSelected) { 
    clauses.add("engine=:engine"); 
    params.put("engine", engine); 
} 

然後,只需加入條款的列表(例如,利用番石榴的木):

String queryString = Joiner.on(" AND ").join(clauses); 
Query query = session.createQuery(queryString); 

然後遍歷paramsquery.setParameter(key, value)

+0

嗯...似乎一個體面的想法。雖然我們可以有各種選擇(即不僅僅是AND),但我們不需要進行某種自定義分析來確定將AND,OR,NOT等放置在哪裏? – f1dave 2011-05-18 16:25:13

+0

好吧,如果你喜歡,你可以加入一個'StringBuilder'。或者有單獨的名單和詞曲,或詞曲等。 – Bozho 2011-05-18 16:34:32

0

我能想到的一種作弊的方式,但我想/希望查詢將被優化。您可以在準備好的聲明中添加額外的參數,以確定您希望添加的條件,只有當該字段存在時纔會評估爲真。

select ... 
    from ... 
    where var1=? and <expression associated with that var1> 
    or var2=? and <expression associated with that var2> 
    or etc