2017-06-16 150 views
1

我想知道如何將對象列表綁定到sql中,其中'where'子句中具有多於1個參數。spring jdbctemplate - 如何綁定列表(包含多於1個參數)到查詢參數

Select * from order where order_id = ? and action_code = ? 

數據就像

List<Order> orderList = new ArrayList<>(); 
orderList.add(1,"KP"); 
orderList.add(2,"DP"); 
orderList.add(3,"KP"); 

這裏是我試過 我的訂單列表。每個訂單都有訂單ID(長)和行爲代碼(字符串)。現在我需要查詢數據庫的訂單號和行動代碼作爲where子句中的參數。

選擇* from order where order_id =?和action_code =?。

我試圖在args中傳遞一個對象數組。 [這個工作]。

Object[] args = new Object[ size of orderList ] 
int i = 0 
for (Order order : orderList) 
{ 
    args[i] = new Object[]{order.getOrderId(), order.getActionCode()}; 
    i++; 
} 

我射擊查詢,如下

jdbcTemplate.query(sql, args, rowMapper); 

當我運行該應用程序,我得到下面的錯誤。

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT * where ORD_I = ? AND ACT_C = ?]; SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type 

但是如果我通過數據如下它的工作原理

jdbcTemplate.query(sql, new Object[] {orderList.get(0).getOrderId, orderList.get(0).getActionCode()}, rowMapper); 

我至今 我所提供的類型如下[DB中試過,ORDER_ID是數(38),action_code是Char(2))

int[] types = new int[] { java.sql.Types.NUMERIC, java.sql.Types.CHAR 
}; 
jdbcTemplate.query(sql, args, types, rowMapper); 

我得到了一個異常說。 [同樣的錯誤,當我與java.sql.Types.VARCHAR取代java.sql.Types.CHAR]

org.springframework.dao.InvalidDataAccessApiUsageException: args and argTypes parameters must match 

的下方設置了作品

int[] types = new int[] { java.sql.Types.NUMERIC, java.sql.Types.CHAR 
    }; 
jdbcTemplate.query(sql, new Object[] {orderList.get(0).getOrderId, orderList.get(0).getActionCode()}, types, rowMapper); 

下面我有問題 How set Array/List in Spring jdbcTemplate as parameter?簡稱 - 會談關於從列表中傳遞一個參數

how to bind a list of tuples using Spring JDBCTemplate? - 有關元組的討論。如果我必須查詢2 tableA.id = tableB.id和tableA.id =?和tableB.seq_id =?,那麼上述解決方案不起作用。

我搜索了很多,但現在我碰到了一個路障。請幫助。

回答

0

我知道這個解決方案不適用於列表,但我建議使用NamedParameterJdbcTemplates而不是常規的jdbcTemplate。它更簡單和相對小的變化:

SQL:

Select * from order where order_id = :orderId and action_code = :actionCode 

的orderIDactionCode對應於你的參數HashMap中的字符串鍵值(如下圖所示)。

的Java:

Map<String, Object> parameters = new HashMap<>(); 
parameters.put("orderID","KP"); 
parameters.put("actionCode","DP"); 

namedParameterJdbcTemplate.execute(sqlQueryString, parameters); 

您加載所有的參數爲鍵值地圖,包含字符串鍵。

編輯回答評論:

爲什麼不執行查詢內循環,並將結果保存到地圖?我想爲僞代碼:

for (set in parameterSet){ 
parameters.put(set1, set2); 
ResultSet rs = jdbcTemplate.execute(queryString, parameters); 
otherMap.put(set1 + set2, rs);} 

這裏setorderIDactionCode參數的組合,parameterSets都的orderID組合(套),並actionCode要查詢,otherMap是一些地圖您創建的集合用於將數據保存在for循環之外,使用第一個和第二個設置參數的concat作爲關鍵字,結果集作爲值。

編輯跟進評論:

如果你有1000個唯一對,那麼這意味着每個這些獨特的雙參數應該返回不同的,相互排斥的結果集。例如,在WHERE條件中輸入參數A和B應該返回不同的ResultSet,而不是輸入參數A和C.我沒有看到一個快捷方式。你基本上要求1000個不同的問題,每個問題都有不同的答案。以確保您得到您的所有結果集和執行只有一個查詢的唯一方法是通過在所有可能的值作爲第一個參數和第二個參數餵養:

WHERE parameter1 IN (... all possible values for parameter1) AND 
parameter2 IN (... all possible values for parameter2) 

但是,這會產生比你想要顯著更多的行。然後,您必須以編程方式應用您自己的邏輯,以過濾掉不屬於該組唯一參數組合的結果集。

+0

對於遲到的迴應感到遺憾...遠離工作!!!!然而,由於「orderId」或「actionCode」關鍵字保持不變,數據在for循環中被覆蓋。如何去做這件事? –

+0

查看我編輯的回覆,我試圖提出一個解決方案。 –

+0

如果我有1000個orderid-acioncode對,那麼使用這種方法我需要激發1000個選擇查詢。會有很大的表現。不春天jdbc模板有任何功能,以適應這種情況下,或者我在這裏錯過了什麼?幫助深受讚賞。 –