我在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);
答案 0 :(得分:12)
您需要限制SQL Insert中指定的列。
请参阅SimpleJdbcInsert.usingColumns()
如果不这样做,SQL语句将需要所有列的值,并且不能使用默认值。
e.g。使用
insert into mytable (col1, col2) values (val1, val2);
而不是
insert into mytable values (val1, val2);
答案 1 :(得分:1)
INSERT INTO mytable (1,null)
与INSERT INTO mytable (1)
不同。先前具体插入null
,后者将决策留给DB(这将是默认值)。 Spring JDBC正在做前者。
答案 2 :(得分:1)
问题出在其他地方:当我使用SimpleJdbcInsert
并将参数映射传递给它时,我很简单地希望仅使用我提供的参数创建插入语句。我在表中有一个带有DEFAULT值的NOT NULL列,我不想指定它。我也不想明确地将所有列名放在usingColumns()
中,因为我只是在创建参数映射时才这样做!我为什么要再做一次?问题是SimpleJdbcInsert
希望更聪明,并将所有列添加到insert语句中,这是不必要的。为什么不使用参数map提供的列创建语句?
答案 3 :(得分:0)
您可以将具有默认值的列添加为usingGeneratedKeyColumns()
的参数
作为该方法的参数包含的列名将从生成的INSERT
语句中省略。
答案 4 :(得分:0)
由于OP正在向| id | lastname | ranking |
| --- | ---------- | ------- |
| 1 | Gustafsson | 3 |
| 2 | Cyborg | 4 |
| 3 | Jones | 1 |
| 4 | Sonnen | 2 |
提供MAP。
这就是我所做的。
我提取了Map键并将其转换为SimpleJdbcInsert
,如下所示
String[]
在启动Set<String> set = map.keySet();
String[] stringArray = (String[]) map.keySet().toArray(new String[set.size()]);`
时,我在想要使用的列中传递了以下内容
SimpleJdbcInsert
希望有帮助。