【问题标题】:Is there a way to extract primary key(or ROWID) using NamedParameterJdbcTemplate and GeneratedKeyHolder?有没有办法使用 NamedParameterJdbcTemplate 和 GeneratedKeyHolder 提取主键(或 ROWID)?
【发布时间】:2012-07-12 11:37:31
【问题描述】:

我正在尝试使用 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 来完成,但它使我的代码在某些条件下难以阅读和操作)。非常感谢您的建议。

【问题讨论】:

标签: java spring ojdbc


【解决方案1】:

你必须使用这个

namedParameterJdbcTemplate.update("INSERT INTO TABLE(ID, col1, col2)"
            + "VALUES(TABLE.TABLE_SEQ.NEXTVAL, :param1, :param2)",
            parameters, keyHolder, new String[]{"ID"});

【讨论】:

  • 它不适用于超过 7 列的表格你有解决这个问题的办法吗
  • @BhargavModi 有什么例外?
  • 您能展示一下您的表结构以及您如何使用 NamedParameterJdbcTemplate 吗?
  • 你能删除“返回输入请求ID”吗?
  • 查询已修复和更正,但如果我使用 7 列进行插入,则它按预期工作正常。但如果我将其设置为 8 列,则会出现异常
【解决方案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 )
            {
    }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多