2013-12-10 55 views
8

我在MYSQL中有一個表格,並且我正在使用JDBC模板對該表格進行插入。爲什麼Spring的JDBC模板不使用表格默認值

其中一列有默認值,我沒有在Map<String, Object> parameters地圖中指定它。

我收到異常Column 'colName' cannot be null

任何人都可以解釋這個嗎?

感謝

* 編輯:代碼*

contactDetailsInsertTemplate = new SimpleJdbcInsert(dataSource).withTableName("contactdetails").usingGeneratedKeyColumns("contactcode"); 
Map<String, Object> parameters = new HashMap<String, Object>(); 
Number newId = contactDetailsInsertTemplate.executeAndReturnKey(parameters); 
+0

請顯示您使用的代碼。 –

回答

11

您需要限制在SQL插入中指定的列。

SimpleJdbcInsert.usingColumns()

如果你不這樣做,將SQL語句需要的所有列和默認值的值不能使用。

例如使用

insert into mytable (col1, col2) values (val1, val2); 

,而不是

insert into mytable values (val1, val2); 
1

INSERT INTO mytable (1,null)是不一樣的INSERT INTO mytable (1)。之前特別插入null,後者將決定留給DB(這將是默認值)。 Spring JDBC正在做前者。

+0

感謝您的回答。你的答案都是正確的,但NickJ的答案對於具體問題更準確。我希望我可以接受你們兩個,但我會接受他,並upvote你:)。 – Gleeb

1

的問題是其他地方:當我使用SimpleJdbcInsert,並通過地圖上的參數給它,我簡單的希望創建插入statment只能用我提供的參數。我有DEFAULT值表中的NOT NULL列,我不想指定它。我也不想明確地將所有列名放在usingColumns()中,因爲我只是在創建參數圖時才這樣做!我爲什麼要再做一次?問題是SimpleJdbcInsert希望更聰明,並添加所有列來插入不必要的語句。爲什麼不使用參數map提供的列創建語句?

請參見:http://forum.spring.io/forum/spring-projects/data/54209-simplejdbcinsert-and-columns-with-default-values

0

您可以添加其中有一個默認值作爲參數傳遞給usingGeneratedKeyColumns()列。
作爲該方法參數包含的列名將從生成的INSERT語句中省略。