SpringJDBC:Parameter index out of range (1 > number of parameters, which is 0).


數據庫錯誤:Parameter index out of range (1 > number of parameters, which is 0).

錯誤發生原因其實很簡單,就是當設置參數時,沒有相應的問號與之匹配(或者根本就沒有?號)

與sql語句有關的原因如下:
第一種:?號被單引號包圍。

(正確的應該是?號的兩邊沒有單引號包圍才對)
(如setString(1,“slkdjfkd”);時sql語句為:insert into table1 (c1,c2) values (’?’,’?’))。
此時?會被作為參數傳入,而不會再傳入 setString里面的值。
第二種: sql語句中沒有?號,在后面用到了set語句。

(如:select * from table);此時無需傳值。傳值就會出錯。
第三種:初學者很常見的錯誤:?—? 寫成了中文的問號導致報錯

這兩個問號是不同了,因為一個是中文,一個是英文,如果在sql語句中寫入的是中文,將無法識別。

以上是在網上找到的問題的解答,經過分析我程序的問題屬性第二種。我實際上使用SQL語句是SELECT COUNT(id) FROM app_role LIMIT 20 OFFSET 0,這里面沒有占位符,但我卻傳遞了參數,參數的類型是Map<String,Object>。實際上這個Map中是沒有內容的即Map.size()=0。

我的問題來了,我必須使用Map傳遞參數,在沒有參數時Map的size=0,這種情況該如何處理呢?

這就是JdbcTemplate和NamedParameterJdbcTemplate類在使用上的差別。

首先JdbcTemplate中方法queryForObject:

<T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException;

注意它的次序,它的參數是最后一個,如果在sql語句中沒有?占位符,那么參數args必須是空的,而我卻傳遞了一個Map類型,類型和個數都不適合,於是發生了錯誤

在使用NamedParameterJdbcTemplate的queryForObject方法:

public <T> T queryForObject(String sql, Map<String, ?> paramMap, Class<T> requiredType) throws DataAccessException

注意SQL語句中使用命名參數是通過Map傳遞的,如果sql中沒有命名參數則不需要paramMap中的參數進行替換,這真是一個好的用法,因此當你需要傳遞參數時參數個數不需要自己判斷。於是這個錯誤使用NamedParameterJdbcTemplate的queryForObject方法就解決了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM