2012-07-12 108 views
5

我想使用Spring的NamedParameterJdbcTemplate和GeneratedKeyHolder提取ROWID或主键。有没有办法使用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没有映射甲骨文RowId的java的RowId的。

任何人可以建议是否有任何方法来提取密钥? (是的,它可以使用PreparedStatement完成,但它使我的代码在一些条件下难以阅读和操作)。你的建议非常感谢。

+0

列名我不知道你是否有同样的问题,但你检查此链接http://stackoverflow.com/questions/4496336/nextval-jdbc-insert-problem。 – 2012-07-12 12:13:40

+0

ROWID不是数字类型,请尝试获取字符串。 – Jason 2012-07-13 03:51:16

回答

13

你必须使用这个

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

它不适用于超过7列的表格你有任何解决方案此问题 – 2015-01-22 09:47:14

+1

@BhargavModi有什么例外? – Wins 2015-01-22 14:39:54

+0

你可以显示你的表结构和你如何使用NamedParameterJdbcTemplate? – Wins 2015-01-23 17:08:29

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) 
      { 
    } 
    } 
相关问题