首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring + MySQL 新增欄位後保存報「No value specified for parameter 46」解決方案

     編輯:程式設計綜合問答

錯誤訊息解讀

nested exception is java.sql.SQLException: No value specified for parameter 46

第 46 個預設參數(`PreparedStatement` 的 `?` 佔位符)未綁定值。通常發生在 **實體類新增欄位,但 SQL 映射(XML/Annotation)未同步更新** 導致參數數量不匹配。

排查清單

檢查點說明修正動作
Entity 新增欄位`private String newField;` + getter/setter確認欄位名稱、型別與資料庫一致
MyBatis ResultMap``補上缺失映射
Insert SQL`INSERT INTO t (..., new_field) VALUES (..., #{newField})`欄位與 `#{}` 參數一一對應
Update SQL`UPDATE t SET ..., new_field = #{newField} WHERE ...`同步新增
動態 SQL ``/``若用 ``確認條件邏輯不導致參數缺失
@Insert/@Update 註解註解內 SQL 字串同步修改

快速定位技巧

  1. 開啟 MyBatis 日誌(`logging.level.org.apache.ibatis=DEBUG`),查看實際執行的 SQL 與參數列表。
  2. 數一下 SQL 中 `?` 或 `#{}` 的個數,與 Java 端綁定參數個數比對。
  3. 若使用 `useGeneratedKeys`/`keyProperty`,確認主鍵回填不影響參數索引。

常見疏忽案例

@* 錯誤:Insert SQL 少寫新欄位 *@
@Insert("INSERT INTO t(a,b) VALUES(#{a},#{b})")  // 實際表有 a,b,c 三欄
void insert(Entity e);

@* 正確 *@
@Insert("INSERT INTO t(a,b,c) VALUES(#{a},#{b},#{c})")
void insert(Entity e);

總結

「No value specified for parameter N」= **SQL 參數佔位符與實體屬性/映射不一致**。新增欄位時,**務必同步更新 Entity、ResultMap、Insert/Update SQL** 三處,並用 DEBUG 日誌驗證參數綁定順序。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved