Java jdbc template índice de coluna invalido

3 respostas
J

Bom dia,

estou dando manutenção em um sistema com jdbc template no spring mvc…
Ele precisa retorna um json via rest porém o select esta retornando um erro que não consigo entender.
Coloquei um sisout pra pegar o select no console que esta sendo aplicado, jogo ele no plsql developer e roda normalmente. Não conheço muito sobre JDBC template será que a sintaxe é diferente do que estou fazendo?
Seguem as classes: Eu mascarei o select…

@Repository
public class DAOImpl implements DAO {

private JdbcTemplate jdbcTemplate;

@Autowired

public DAOImpl(DataSource dataSource) {

jdbcTemplate = new JdbcTemplate(dataSource);

}

public Entity findById(Long id) {

StringBuffer sql = new StringBuffer();

  sql.append(" SELECT '6972837'");
  
  System.out.println(sql);
  
  return jdbcTemplate.queryForObject(sql.toString(), new Mapper(), id);

}

}

[INFO ] [2018-09-03 17:26:13,908] [stdout:71] - SELECT WHERE = ‘6972837’
[INFO ] [2018-09-03 17:26:14,034] [XmlBeanDefinitionReader:315] - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
[INFO ] [2018-09-03 17:26:14,050] [SQLErrorCodesFactory:126] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
17:26:14,066 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/application].[dispatcher]] (http-localhost/127.0.0.1:8180-1) JBWEB000236: Servlet.service() for servlet dispatcher threw exception: java.sql.SQLException: Índice de coluna inválido
at oracle.jdbc.driver.OraclePreparedStatement.setLongInternal(OraclePreparedStatement.java:4919)

Obrigado!

3 Respostas

D

If that’s a SQLException thrown by Java, it’s most likely because you are trying to get or set a value from a ResultSet, but the index you are using isn’t within the range.

Isso foi retirado daui.
Em JDBC, quando você realiza uma query, você tem dois modos de acessar os dados em um resultset: pelo nome da coluna ou pelo índice da coluna.
Pelo primeiro, obviamente, é fácil. Pelo segundo, teoricamente, deveria ser também.

Veja o exemplo:

SELECT col1, col2, col3, col4 FROM tabela;

Logo, o resultset poderia ser acesado com

rs.getString("col1");
rs.getString("col2");
rs.getString("col3");
rs.getString("col4");

Ou

rs.getString(1);
rs.getString(2);
rs.getString(3);
rs.getString(4);

Porém, se você fizer algo como:

rs.getString(10);

Terá o mesmo erro que está tendo.
Eu não sei como o Spring faz no JDBCTemplate, mas, seria interessante analisar isso, para evitar o erro. Ou, de repente, é você que está buscando um índice inexistente.

Eu não me recordo com certeza, porém, talvez você esteja tentando acessar um elemento retornado por um nome que não é o adequado, exemplo.

SELECT col1 as COLUNA1 FROM tabela;

No ResultSet, você terá de usar o alias para recuperar a informação:

rs.getString("COLUNA1");

Caso contrário, não conseguirá. Eu só não estou certo se a mesma exceção é disparada.

J

Darlan primeiro obrigado demais por sua dedicação na resposta.

Eu entendi o que você disse, porém ele nem chega a devolver o result set o erro acontece na ultima linha, segue:

@Repository
public class DAOImpl implements DAO {

@Autowired
private SimpleJdbcTemplate jdbcTemplate;

public Entity findById(Long parametro) {

StringBuffer sql = new StringBuffer();

  sql.append(" SELECT TB.CLM AS COLUNA,");
  sql.append("UM MONTE DE REGRAS E SELECTS");
  sql.append("FROM BASE.TABLE TB,");
  sql.append("AND TB.COLUNA = '?'");
  
  System.out.println(sql); // Este select que é printado no console quando feito no plsql não acontece nenhum erro.
  
  return jdbcTemplate.queryForObject(sql.toString(), new Mapper(), parametro);

Erro exibido:

[INFO ] [2018-09-04 10:06:37,359] [XmlBeanDefinitionReader:315] - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
[INFO ] [2018-09-04 10:06:37,403] [SQLErrorCodesFactory:126] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
10:06:37,403 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/aplicacao].[dispatcher]] (http-localhost/127.0.0.1:8180-1) JBWEB000236: Servlet.service() for servlet dispatcher threw exception: java.sql.SQLException: Índice de coluna inválido

Tem alguma idéia?

Obrigado!

D

Claro que não retorna, o JdbcTemplate suprime o que deveria ser o resultset em prol de inserir as informações diretamente no objeto definido pelo mapper, né?
É a isso que me refiro.
A questão é que o Spring está tentando acessar uma coluna que não foi referenciada no select.

Criado 4 de setembro de 2018
Ultima resposta 4 de set. de 2018
Respostas 3
Participantes 2