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

问题描述 投票:8回答:4

我在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);
java mysql sql spring jdbctemplate
4个回答
12
投票

您需要限制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正在做前者。


1
投票

问题出在其他地方:当我使用SimpleJdbcInsert并将参数映射传递给它时,我简单地期望仅使用我提供的参数创建插入语句。我在表中有一个带有DEFAULT值的NOT NULL列,我不想指定它。我也不想明确地将所有列名放在usingColumns()中,因为我只是在创建参数映射时这样做!我为什么要再做一次?问题是SimpleJdbcInsert希望更聪明,并将所有列添加到insert语句中,这是不必要的。为什么不使用参数map提供的列创建语句?

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.