为什么Spring的JDBC模板不使用表的默认值

时间:2013-12-10 15:09:39

标签: java mysql sql spring jdbctemplate

我在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);

5 个答案:

答案 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提供的列创建语句?

请参阅:http://forum.spring.io/forum/spring-projects/data/54209-simplejdbcinsert-and-columns-with-default-values

答案 3 :(得分:0)

您可以将具有默认值的列添加为usingGeneratedKeyColumns()的参数 作为该方法的参数包含的列名将从生成的INSERT语句中省略。

答案 4 :(得分:0)

由于OP正在向| id | lastname | ranking | | --- | ---------- | ------- | | 1 | Gustafsson | 3 | | 2 | Cyborg | 4 | | 3 | Jones | 1 | | 4 | Sonnen | 2 | 提供MAP。

这就是我所做的。

  1. 我确保MAP只有要插入的列。
  2. 我提取了Map键并将其转换为SimpleJdbcInsert,如下所示

    String[]
  3. 在启动Set<String> set = map.keySet(); String[] stringArray = (String[]) map.keySet().toArray(new String[set.size()]);` 时,我在想要使用的列中传递了以下内容

    SimpleJdbcInsert

希望有帮助。