8

Spring の NamedParameterJdbcTemplate と GeneratedKeyHolder を使用して、ROWID または主キーを抽出しようとしています。

私はこのようなことをしようとしています。

MapSqlParameterSource parameters = new MapSqlParameterSource()
                .addValue("param1", value1)
                .addValue("param2", value2);
KeyHolder keyHolder = new GeneratedKeyHolder();
namedParameterJdbcTemplate.update("INSERT INTO TABLE(ID, col1, col2)"
                + "VALUES(TABLE.TABLE_SEQ.NEXTVAL, :param1, :param2)",
                parameters, keyHolder);

上記のクエリを実行しようとするとkeyHolder.getKey().longValue()、以下の例外がスローされます。

HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]

このhttp://docs.oracle.com/cd/B28359_01/java.111/b31224/datacc.htmを調べたとき、ojdbcがoracle RowIdをJava RowIdにマッピングしていないことを理解しました(理解できたと思います)。

キーを抽出する方法はありますか?(はい、PreparedStatement を使用して実行できますが、一部の条件でコードを読み取ったり操作したりするのが少し見苦しくなります)。あなたの提案は大歓迎です。

4

2 に答える 2

19

これを使用する必要があります

namedParameterJdbcTemplate.update("INSERT INTO TABLE(ID, col1, col2)"
            + "VALUES(TABLE.TABLE_SEQ.NEXTVAL, :param1, :param2)",
            parameters, keyHolder, new String[]{"ID"});
于 2012-07-13T03:41:29.583 に答える
2

完全に機能する例を次に示します。データベースが Oracle であり、生成された ID を格納する列名が「GENERATED_ID」であると仮定します (任意の名前を指定できます)。

       public Integer insertRecordReturnGeneratedId(final MyObject obj)
        {
        final String INSERT_QUERY = "INSERT INTO MY_TABLE  VALUES(GENERATED_ID_SEQ.NEXTVAL, :param1, :param2)";
        try
            {
                MapSqlParameterSource parameters = new MapSqlParameterSource().addValue( "param1", obj.getField1() ).addValue( "param2",  obj.getField1() ) ;
                final KeyHolder holder = new GeneratedKeyHolder();
                this.namedParameterJdbcTemplate.update( INSERT_QUERY, parameters, holder, new String[] {"GENERATED_ID" } );
                Number generatedId = holder.getKey();
               // Note: USING holder.getKey("GENERATED_ID") IS ok TOO.
                return generatedId.intValue();
            }
            catch( DataAccessException dataAccessException )
            {
    }
    }
于 2016-08-06T19:25:13.657 に答える