2013-12-10 2 views
8

私はMYSQLにテーブルを持っており、そのテーブルに挿入するためにJDBCテンプレートを使用しています。なぜSpringのJDBCテンプレートでテーブルのデフォルト値が使用されないのですか

カラムの1つにデフォルト値があり、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挿入で指定した列を制限する必要があります。

は、あなたがこれをしない場合は、SQL文が使用できないすべての列とデフォルト値の値が必要になりますSimpleJdbcInsert.usingColumns()

を参照してください。

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を使用して、それにパラメータのマップを渡すとき、私はシンプルなだけで、私は提供されたパラメータを挿入なステートメントを作成することを期待しています。私はDEFAULT値を持つテーブルにNOT NULLカラムを持っていて、それを指定したくありません。私は明示的にすべての列名をusingColumns()に入れないようにしたいのですが、私はパラメータのマップを作成するときにそれをやっています!なぜ私はそれをもう一度やりますか?問題は、SimpleJdbcInsertがよりスマートになり、必要でない挿入文にすべての列を追加したいということです。なぜパラメータマップで提供される列を使用してのみステートメントを作成しますか?

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

0

あなたはusingGeneratedKeyColumns()へのパラメータとしてデフォルト値を持つ列を追加することができます。
このメソッドのパラメータとして含まれる列名は、生成されたINSERTステートメントから除外されます。

関連する問題