2012-07-12 66 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) 
      { 
    } 
    } 
相關問題