我正在尝试使用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完成,但它使我的代码在某些条件下阅读和操作有点难看)。非常感谢您的建议。
答案 0 :(得分:13)
你必须使用这个
namedParameterJdbcTemplate.update("INSERT INTO TABLE(ID, col1, col2)"
+ "VALUES(TABLE.TABLE_SEQ.NEXTVAL, :param1, :param2)",
parameters, keyHolder, new String[]{"ID"});
答案 1 :(得分:0)
这是一个完整的工作示例:假设数据库是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 )
{
}
}