2010-05-11 92 views
4

我有以下代碼:如何在spring中使用IN子句執行查詢?

try { 
      MapSqlParameterSource parameters = new MapSqlParameterSource(); 
      parameters.addValue("ids", year); 

      return this.template.getJdbcOperations().query(
        "SELECT * FROM INCOME WHERE PROVNUM=? AND FISCALDATE IN (:ids)", this.rowMapper, parameters); 


     }catch (EmptyResultDataAccessException ex) { 
      return null; 
     } 

,但我不能夠發送值PROVNUM。怎麼做?

需要幫助, 謝謝。

+2

具體問題與IN子句無關。 – BalusC 2010-05-11 12:06:31

回答

4

只需使用一個名爲參數「provnum」也:

String sql = "SELECT * FROM INCOME WHERE PROVNUM=:provnum AND FISCALDATE IN (:ids)" 
MapSqlParameterSource parameters = new MapSqlParameterSource(); 
parameters.addValue("ids", year); 
parameters.addValue("provnum", ...); 
return template.getJdbcOperations().query(sql, rowMapper, parameters); 
+0

得到這個execption org.springframework.dao.DataIntegrityViolationException:PreparedStatementCallback; SQL [SELECT * FROM INCOME WHERE PROVNUM =:provNum和FISCALDATE IN(:ids)];無法在org.springframework.jdbc.core.namedparam.MapSqlParameterSource和JAVA_OBJECT之間進行轉換。嵌套異常是java.sql.SQLException:無法在org.springframework.jdbc.core.namedparam.MapSqlParameterSource和JAVA_OBJECT之間進行轉換。 – GuruKulki 2010-05-11 12:08:52

+0

關於此的SpringSource文檔可以發現: http://static.springsource.org/spring/docs/2.5.x/reference/jdbc.html#jdbc-in-clause 請確保您使用的是集合實現List接口並且不使用自定義對象。爲了說明問題,我沒有嘗試使用日期列表,但是Matt的例子可以用於列表,列表等。 – jnt30 2010-05-11 12:25:50

+0

@GK請發佈代碼,包括您添加的任何參數的類型/值'addValue()' – 2010-05-11 13:13:42

9

它看起來像你混合命名和位置參數。最好使用其中一種,但不能同時使用。

嘗試

MapSqlParameterSource parameters = new MapSqlParameterSource(); 
parameters.addValue("ids", year); 
parameters.addValue("provnum", provnum); 

return this.template.getJdbcOperations().query(
        "SELECT * FROM INCOME WHERE PROVNUM=:provnum AND FISCALDATE IN (:ids)", this.rowMapper, parameters); 

您的評論後,我看到你正在使用的query()方法的錯誤超載:有相當多的選擇,所以這並不奇怪了幾個錯誤,可以在爬!

你需要調用

return this.template.getJdbcOperations().query(
     "SELECT ... etc.", parameters, this.rowMapper); 

在原來的通話,你撥打的預期字面參數版本query(String sql, RowMapper mapper, Object... params)。修改後的調用是查詢(String sql,SqlParameterSource params,RowMapper映射器) - SqlParamtersSource作爲第二個參數是關鍵。此外,只是值得檢查,你正在使用NamedParameterJdbcTemplate

+1

我認爲這是關鍵,確保你使用的是NamedParameterJdbcTemplate,常規的JdbcTemplate不支持命名參數。 – mezmo 2010-05-11 13:39:54

相關問題