Java - Dúvidas no ResultSet.getInt

14 respostas Resolvido
G

Olá pessoal, é a primeira vez que uso o Guj. Estou com uma dúvida…
Bom eu sei que quando eu quero pegar o id gerado eu uso:

Int var = rs.getInt(1);

Esse 1 é o índice da minha coluna ?
Porque eu criei outra tabela e coloquei:
NOME, CPF, ID.
Então o meu índice não deveria ser 3 ? Pois ele não acompanha a coluna ?
Porém se eu coloco Int var = rs.getInt(3);
Ele explode um erro de ColumnIndex 3 > 1… Porque ?

14 Respostas

wldomiciano

Sim, este 1 representa o índice da coluna. No caso vc estaria solicitando a primeira coluna.

Só que este índice nem sempre está relacionado com a posição da coluna no banco de dados.

Se no seu SELECT vc listar as colunas que vc quer, este índice estará relacionado com a posição em que a coluna aparece nesta lista. Por exemplo:

try (final PreparedStatement statement = conn.prepareStatement("SELECT * FROM cliente")) {
  final ResultSet resultSet = statement.executeQuery();

  if (resultSet.next()) {
    System.out.println(resultSet.getInt(3));
  }
}

O código acima retorna o resultado desejado, pois o asterisco traz as colunas na ordem em que foram criadas. Porém…

try (final PreparedStatement statement = conn.prepareStatement("SELECT id, cpf, nome FROM cliente")) {
  final ResultSet resultSet = statement.executeQuery();

  if (resultSet.next()) {
    System.out.println(resultSet.getInt(3));
  }
}

O código acima gera erro, pois é o nome que está na terceira posição da query e ele não pode ser convertido para int.

try (final PreparedStatement statement = conn.prepareStatement("SELECT nome FROM cliente")) {
  final ResultSet resultSet = statement.executeQuery();

  if (resultSet.next()) {
    System.out.println(resultSet.getInt(3));
  }
}

O código acima gera o erro que vc mencionou, pois eu estou trazendo apenas uma coluna, mas estou tentando acessar a terceira, isto é, estou tentando acessar o índice de uma coluna que não existe na query.

Por isso eu acredito que o problema pode estar em como vc montou seu SELECT.

G

Mas imagine que na 3 coluna eu coloquei id que no caso é int… Nao deveria retornar resultset.getint(3) ? Sendo que é o índice ? Sendo que o id esta listado na 3 coluna ?

wldomiciano

Se o seu SELECT está correto, com pelo menos 3 colunas, realmente é estranho.

Para te ajudar só eu vendo como vc fez exatamente e testando mesmo. Se quiser, mostra seu código para eu testar.

G

Só um minuto

G
Create table estado {

Nome

Local

Id Pk

}
G

resultset.getInt(3);

G

Quando eu coloco getInt(1) o resultado vem…
Independentemente da onde a coluna está…

G

Talvez o Index não tem haver com o jeito que tu cria a tabela… E sim pelo id…

wldomiciano

Então, é como eu disse, tem a ver com a ordem das colunas no SELECT.

Se vc mostrar seu código eu posso tentar rodar aqui.

G

package modelo;
/**
*

  • @author ED
    
    */
    
    public class Telefone{
    
    private int id_Telefone;
    
    private String telefone_Pessoal;
    
    private String telefone_Fixo;
    
    public int getId_Telefone() {
    
    return id_Telefone;
    
    }
    
    public String getTelefone_Pessoal() {
    
    return telefone_Pessoal;
    
    }
    
    public void setTelefone_Pessoal(String telefone_Pessoal) {
    
    this.telefone_Pessoal = telefone_Pessoal;
    
    }
    
    public String getTelefone_Fixo() {
    
    return telefone_Fixo;
    
    }
    
    public void setTelefone_Fixo(String telefone_Fixo) {
    
    this.telefone_Fixo = telefone_Fixo;
    
    }
    
    public void setId_Telefone(int id_Telefone) {
    
    this.id_Telefone = id_Telefone;
    
    }
    

}

G
public void salvar_Telefones(Telefone telefones) throws SQLException{

Connection conexao_Banco_Dados = Conexao_Banco_Dados.getConexaoBD();

try{

PreparedStatement stmt = conexao_Banco_Dados.prepareStatement(insert into

+ " telefone (telefone_pessoa, telefone_fixo) values "

+ (?,?),PreparedStatement.RETURN_GENERATED_KEYS);

stmt.setString(1, telefones.getTelefone_Fixo());

stmt.setString(2, telefones.getTelefone_Pessoal());

//vamos jogar no banco de dados usando o

comando a baixo

stmt.executeUpdate(); //executar e atualizar la dentro

ResultSet rs = stmt.getGeneratedKeys();

if (rs.next()) {

telefones.setId_Telefone(rs.getInt(3));

}

}catch(SQLException error){

throw new SQLException("FALHA AO INSERIR TELEFONE "+error);

}

}
wldomiciano

Ah, agora ficou mais claro o seu problema.

O método getGeneratedKeys() retorna os ids que foram auto-gerados pelo banco. Ou seja, ele retorna apenas uma coluna contendo estes ids.

É por isso que vc vê aquele erro quando invoca getInt(3). O correto é usar getInt(1) mesmo, pois só há uma coluna neste ResultSet.

G

Como assim 1 coluna ? Nao sao 3 ?

wldomiciano
Solucao aceita

Não. Quando vc faz isso:

ResultSet rs = stmt.getGeneratedKeys();

Ele retorna apenas um coluna contendo os ids gerados. Dá uma olha na doc:

https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#getGeneratedKeys--

Ah, experimenta colocar um print tipo assim:

ResultSet rs = stmt.getGeneratedKeys();
System.out.println(rs);

Vc vai ver algo assim no console:

LocalResultImpl@1697f2b3 columns: 1 rows: 1 pos: -1

No caso dizendo que só tem uma coluna e uma linha.

Criado 12 de setembro de 2021
Ultima resposta 12 de set. de 2021
Respostas 14
Participantes 2