wrongwrongな開発日記

しんまいさんの忘備録

【JDBC】SimpleJdbcInsertでDEFAULTを設定したカラムへのInsert時にcannot be nullと言われる状況への対処

wrongwrong163377.hatenablog.com
この記事に書いたやり方でも動きますが、より演繹的な方法が有ったのでこちらもどうぞ。

問題

SimpleJdbcInsertでInsert時に、DDLでNOT NULLとDEFAULTを設定したカラムについてMapSqlParameterSourceに値を指定しなかった場合、com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column '[カラム名]' cannot be nullと言われます。

原因

テーブルの内指定していないカラムに関する値は全てNULLで埋められてしまうため、「NULLをInsertしようとする→NULLは設定できないのでエラー」となります。

対策

以下のように、usingColumnsを使って使うカラム名を初期化時に指定することで、問題が発生しなくなります。

SimpleJdbcInsert jdbcInsert =
    new SimpleJdbcInsert(jdbcTemplate)
            .withTableName("[テーブル名]")
            .usingColumns("[使うカラム名1], [使うカラム名2], [使うカラム名3], ...);