2012-04-13 103 views
0

Possible Duplicate:
How to generate a dynamic 「in (…)」 sql list through Spring JdbcTemplate?安全查詢

我想準備ID列表在Java中的IN()子句中MSSQL準備逗號分隔的列表。我有下面的代碼,它看起來應該可以工作,但它會引發錯誤:java.sql.SQLException:將nvarchar值'1,2'轉換爲數據類型int時轉換失敗。

我總是有點不知所措,因爲當我傳遞一個字符串時,爲什麼它會像整數一樣嘗試它。任何見解都會很棒。

我也試着改變template.getId()template.getId().toString()沒有運氣

//JOINs 
    Collection<Template> templates = search.getTemplateCollection(); 
    if (templates != null && templates.size() > 0) { 
     searchQuery.append("INNER JOIN dbo.content_to_template ON content_to_template.template_id IN (:templateIds) AND content_to_template.content_id = content.id "); 

     StringBuilder templateIds = new StringBuilder(); 
     for (Template template : templates) { 
      if (templateIds.length() == 0) { 
       templateIds.append(template.getId()); 
      } else { 
       templateIds.append(",").append(template.getId()); 
      } 
     } 
     queryMap.put("templateIds", templateIds.toString()); 
    } 



return this.namedjdbcTemplate.query(searchQuery.toString(), new MapSqlParameterSource(queryMap), this.contentRowMapper); 
+1

不應該'templateIds'是個整數,而不是字符串的集合?即使字符串解決方案工作,您的解決方案也不會很安全,因爲'template.getId()'中的任何逗號都會引入虛假值。 – biziclop 2012-04-13 13:07:58

+0

是的,正如@biziclop提到的那樣 - 嘗試使用int []作爲參數,如果有可能的話。 – JMelnik 2012-04-13 13:08:43

+0

看看這個: http://stackoverflow.com/questions/2810418/how-to-execute-query-with-in-clause-in-spring – Vadzim 2012-04-13 13:09:22

回答

2

你需要準備的模板ID的集合,並把它傳遞到地圖中。 字符串分隔的數據可能無法正常工作,因爲它期望收集。

=======================

List templateIds = new ArrayList(); 
templateIds.add(template.getId()); 

---- 
--- 

queryMap.put("templateIds", templateIds);