ArrayIndexOutOfBoundsException ao utilizar NamedParameterJdbcTemplate + MapSqlParameterSource

Fala galera, bora tirar o pó do blog rs…

me deparei com o erro abaixo, nada intuitivo, utilizando NamedParameterJdbcTemplate e MapSqlParameterSource, onde eu tenho na minha query parâmetros opcionais/nullable, ou seja, parâmetros que podem vir ou não com valor (null):

java.lang.ArrayIndexOutOfBoundsException: 128
	at oracle.jdbc.driver.OracleParameterMetaDataParser.computeBasicInfo(OracleParameterMetaDataParser.java:327)
	at oracle.jdbc.driver.OracleParameterMetaDataParser.getParameterMetaDataSql(OracleParameterMetaDataParser.java:433)
	at oracle.jdbc.driver.OracleParameterMetaData.getParameterMetaData(OracleParameterMetaData.java:58)
	at oracle.jdbc.driver.OraclePreparedStatement.getParameterMetaData(OraclePreparedStatement.java:12861)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.getParameterMetaData(OraclePreparedStatementWrapper.java:1551)
	at org.springframework.jdbc.core.StatementCreatorUtils.setNull(StatementCreatorUtils.java:248)
	at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:229)
	at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147)
	at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:278)
	at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:236)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:657)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:682)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:736)
	at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:212)
	...

após perder alguns minutos pesquisando, não achei nada para resolver, então criei uma solução/tratamento simples:

public <T> void setOptionalParameter(MapSqlParameterSource parameters, String name, T value) {
   if (valor == null)
      parameters.addValue(name, value, Types.NULL);
   else
      parameters.addValue(name, value);
}

Forma de utilização:

MapSqlParameterSource parameters = new MapSqlParameterSource();
new MapSqlParameterSourceUtil().setOptionalParameter(parameters, "optionalParam", optionalParam);
parameters.addValue("mandatoryParam", mandatoryParam);
jdbcTemplate.query(...);

Espero ter ajudado, see ya! 😀

About Gustavo Amaro

+ MBA em Desenvolvimento de Aplicações JAVA – SOA + Formado em Tecnologia e Análise de Sistemas

Posted on 7 de Novembro de 2019, in JDBC, Persistência, Spring and tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 3 comentários.

  1. How to make it work for unnamed parameters?

  2. Hi, could you suggest about unnamed parameters?

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s

%d bloggers like this: