Es allí una manera de extraer la clave principal(o ROWID) utilizando NamedParameterJdbcTemplate y GeneratedKeyHolder?

Estoy tratando de extraer ROWID o la clave principal mediante la Primavera del 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 la consulta anterior cuando intento hacer keyHolder.getKey().longValue() es tirar abajo la 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 sí) que ojdbc no es la asignación de oracle RowId para java RowId.

Puede sugerir hay alguna forma de extraer la llave? (Sí, se puede hacer uso de PreparedStatement pero es para hacer mi código de poco feo para leer y manipular en algunas condiciones). Sus sugerencias son muy apreciadas.

No sé si tiene el mismo problema, pero usted revise este enlace stackoverflow.com/questions/4496336/nextval-jdbc-insert-problem .
ROWID no es el tipo de número, por favor, trate de obtener la cadena.

OriginalEl autor darwinbaisa | 2012-07-12

2 Kommentare

  1. 13

    Usted tiene que utilizar esta

    namedParameterJdbcTemplate.update("INSERT INTO TABLE(ID, col1, col2)"
                + "VALUES(TABLE.TABLE_SEQ.NEXTVAL, :param1, :param2)",
                parameters, keyHolder, new String[]{"ID"});
    no su trabajo de mesa con más de 7 columnas ¿tiene alguna solución para este problema
    ¿Cuál es la excepción?
    Se puede mostrar la estructura de tus tablas y la utilización de NamedParameterJdbcTemplate?
    Se puede eliminar de «DEVOLVER INPUTREQUESTID»?
    la consulta se cura y se corrige, pero si yo uso 7 columnas para insertar que está trabajando muy bien como se esperaba.pero si llego a las 8 de la columna que se dé la excepción

    OriginalEl autor Wins

  2. 0

    Aquí es un ejemplo de trabajo: Suponiendo que la Base de datos de Oracle y el nombre de la columna que almacenar Id generado 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 )
                {
        }
        }

    OriginalEl autor supernova

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea