Pergunta

É possível obter a identidade @@ a partir da inserção SQL em uma Primavera jdbc chamada modelo? Se sim, como?

Foi útil?

Solução

O método JDBCTemplate.update está sobrecarregada para tirar um objeto chamado GeneratedKeyHolder que você pode usar para recuperar a chave gerada automaticamente. Por exemplo (código retirado aqui ):

final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps =
                connection.prepareStatement(INSERT_SQL, new String[] {"id"});
            ps.setString(1, name);
            return ps;
        }
    },
    keyHolder);
// keyHolder.getKey() now contains the generated key

Outras dicas

SimpleJdbcInsert.executeAndReturnKey Que tal? Ele assume duas formas, dependendo da entrada:

(1) A entrada é um Map

public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)

Descrição copiado a partir da interface: SimpleJdbcInsertOperations

Executar a inserção usando os valores passados ??e devolver a chave gerada. Isto requer que o nome das colunas com auto chaves gerado foram especificados. Este método sempre retornará um KeyHolder mas o chamador deve verificar se ele realmente contém as chaves geradas.

especificado por:

executeAndReturnKey na interface de SimpleJdbcInsertOperations

Parâmetros:

args - Map containing column names and corresponding value

Returns:

the generated key value

(2) A entrada é um SqlParameterSource

public java.lang.Number executeAndReturnKey( SqlParameterSource parameterSource)

Descrição copiado a partir da interface: SimpleJdbcInsertOperations

Executar a inserção usando os valores passados ??e devolver a chave gerada. Isto requer que o nome das colunas com auto chaves gerado foram especificados. Este método sempre retornará um KeyHolder mas o chamador deve verificar se ele realmente contém as chaves geradas.

especificado por:

executeAndReturnKey na interface de SimpleJdbcInsertOperations

Parâmetros:

parameterSource - SqlParameterSource containing values to use for insert

Returns:

o valor da chave gerada.

Como adicionar notas detalhadas / código de exemplo para todd.pierzina resposta

jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
                "Primary_key");
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("Column_NAME1", bean.getval1());
        parameters.put("Column_NAME2", bean.getval2());
        // execute insert
        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
                parameters));
           // convert Number to Int using ((Number) key).intValue()
            return ((Number) key).intValue();

Eu não sei se existe um "one-liner", mas este parece fazer o truque (para MSSQL pelo menos):

// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );

artigo decente aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top