2012-07-12 6 views
5

Estoy tratando de extraer ROWID o la clave primaria usando Spring's NamedParameterJdbcTemplate y GeneratedKeyHolder.¿Hay alguna forma de extraer la clave principal (o ROWID) usando NamedParameterJdbcTemplate y GeneratedKeyHolder?

Estoy tratando de hacer algo como esto.

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

Después de ejecutar por encima de consulta cuando intento hacer keyHolder.getKey().longValue() es tirar abajo excepción.

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] 

Cuando fui a través de este http://docs.oracle.com/cd/B28359_01/java.111/b31224/datacc.htm entiendo (espero que lo hice) que ojdbc no está mapeando RowId oráculo para RowId java.

¿Puede alguien sugerir alguna forma de extraer la clave? (Sí, se puede hacer usando PreparedStatement, pero está haciendo que mi código sea algo desagradable de leer y manipular en algunas condiciones). Tus sugerencias son muy apreciadas.

+0

No sé si tienes el mismo problema pero revisa este enlace http://stackoverflow.com/questions/4496336/nextval-jdbc-insert-problem. –

+0

ROWID no es un tipo de número, intente obtener una cadena. – Jason

Respuesta

13

usted tiene que utilizar este

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

No funciona para la tabla que tiene más de 7 columnas ¿Tiene alguna solución para este problema? –

+1

@BhargavModi ¿Cuál es la excepción? – Wins

+0

¿Puedes mostrar la estructura de tu tabla y cómo usas NamedParameterJdbcTemplate? – Wins

0

Aquí es un ejemplo completamente de trabajo: Suponiendo que la base de datos es Oracle y el nombre de la columna que almacenan genera la identificación es "GENERATED_ID" (puede ser cualquier nombre)

 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) 
      { 
    } 
    } 
Cuestiones relacionadas