11

SpringのNamedParameterJdbcTemplateを使用して、テーブルへの挿入を実行しています。テーブルは、シーケンスでNEXTVALを使用して、主キーを取得します。次に、この生成されたIDを私に返したいと思います。私は次のようなSpringのKeyHolder実装を使用しています。

KeyHolder key = new GeneratedKeyHolder();
jdbcTemplate.update(Constants.INSERT_ORDER_STATEMENT, params, key);

ただし、このステートメントを実行すると、次のようになります。

org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
    at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73)

私が欠けているアイデアはありますか?

4

5 に答える 5

23

同様の問題を解決しました-Oracleでは別の方法を使用する必要があります(からNamedParameterJdbcOperations)-

int update(String sql,
           SqlParameterSource paramSource,
           KeyHolder generatedKeyHolder,
           String[] keyColumnNames)
           throws DataAccessException

自動生成された列を含むkeyColumnNamesで、私の場合は["Id"]だけです。それ以外の場合は、ROWID しか取得できません。詳細については、 Spring のドキュメントを参照してください。

于 2011-03-16T22:40:17.217 に答える
4

を実行する必要がありJdbcTemplate.update(PreparedStatementCreator p, KeyHolder k)ます。

KeyHolderデータベースから返されたキーは、パラメーター オブジェクトに挿入されます。

例:

final String INSERT_ORDER_STATEMENT 
       = "insert into order (product_id, quantity) values(?, ?)";

KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(
            Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(
                    INSERT_ORDER_STATEMENT, new String[] { "id" });
                ps.setInt(1, order.getProductId());
                ps.setInt(2, order.getQuantity());
                return ps;
            }
        }, keyHolder);

詳細については、こちらのリファレンス ドキュメントを参照してください。

于 2010-05-12T15:33:12.930 に答える
-4

で間違った方法を使用していると思いますJdbcTemplateupdateあなたのコードフラグメントに一致すると思われる唯一のメソッドは

int update(String sql, Object... args)

その場合、paramsandkeyを 2 要素の vargs 配列として渡し、通常のバインド パラメータとしてJdbcTemplate扱いkey、誤って解釈しています。

を取る唯一のパブリックupdateメソッドはJdbcTemplateKeyHolder

int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)

したがって、それを使用するにはコードを書き換える必要があります。

于 2010-05-12T18:31:31.783 に答える