2012-07-12 12 views
5

Spring'in NamedParameterJdbcTemplate ve GeneratedKeyHolder kullanarak ROWID veya birincil anahtarı ayıklamak çalışıyorum.NamedParameterJdbcTemplate ve GeneratedKeyHolder kullanarak birincil anahtarı (veya ROWID) ayıklamanın bir yolu var mı?

Böyle bir şey yapmaya çalışıyorum.

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); 

sorguda yukarıda yürüttükten sonra bunu istisna altında atıyor keyHolder.getKey().longValue() yapmaya çalıştıklarında. Anladığımdan bu http://docs.oracle.com/cd/B28359_01/java.111/b31224/datacc.htm geçti zaman

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] 

o ojdbc java rowID için Oracle ROWID eşleme değildir (i did umut).

Herhangi biri, anahtarı çıkarmak için herhangi bir yol olduğunu önerebilir mi? (Evet, PreparedStatement kullanılarak yapılabilir, ancak kodumu bazı koşullarda okumak ve değiştirmek için çirkin yapıyor). Önerileriniz çok takdir ediliyor.

+0

oluşturulan sütun adıdır Aynı sorun varsa, bilmiyorum ama bu bağlantıyı kontrol etmek için http://stackoverflow.com/questions/4496336/nextval-jdbc-insert-problem. –

+0

ROWID sayı türü değil, lütfen dizgiyi almaya çalışın. – Jason

cevap

13

Sen kullanmak zorunda bu İşte

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

, 7'den fazla sütun içeren tablo için çalışmıyor Bu sorun için herhangi bir çözüm var mı –

+1

@BhargavModi Özel durum nedir? – Wins

+0

Tablo yapınızı ve NamedParameterJdbcTemplate'i nasıl kullandığınızı gösterir misiniz? – Wins

0

tam çalışma örneği: Veritabanı varsayarsak, Oracle ve mağaza kimliği olan "GENERATED_ID" (olabilir herhangi bir ad)

 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) 
      { 
    } 
    } 
İlgili konular