我在MYSQL中有一个表,我使用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);
您需要限制SQL插入中指定的列。
见SimpleJdbcInsert.usingColumns()
如果不这样做,SQL语句将需要所有列的值,并且不能使用默认值。
例如使用
insert into mytable (col1, col2) values (val1, val2);
代替
insert into mytable values (val1, val2);
INSERT INTO mytable (1,null)
与INSERT INTO mytable (1)
不同。先前专门插入null
,后者将决策留给DB(这将是默认值)。 Spring JDBC正在做前者。
问题出在其他地方:当我使用SimpleJdbcInsert
并将参数映射传递给它时,我简单地期望仅使用我提供的参数创建插入语句。我在表中有一个带有DEFAULT值的NOT NULL列,我不想指定它。我也不想明确地将所有列名放在usingColumns()
中,因为我只是在创建参数映射时这样做!我为什么要再做一次?问题是SimpleJdbcInsert
希望更聪明,并将所有列添加到insert语句中,这是不必要的。为什么不使用参数map提供的列创建语句?
您可以将具有默认值的列作为参数添加到usingGeneratedKeyColumns()
。
作为该方法的参数包含的列名将从生成的INSERT
语句中省略。