[RESOLVIDO] Método Java insert e retornar um valor

Bom dia! Fiz uma método para realizar um insert no BD e preciso que ele me retorne o valor do seu id. Mas ele me retorna esse erro.

Inbox
org.postgresql.util.PSQLException: Nenhum resultado foi retornado pela consulta.
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:120)
at br.grupopn.robo.cetelem.esteira.dao.PropostaDao.gravarArquivo(PropostaDao.java:39)
at br.grupopn.robo.cetelem.esteira.model.Processo.lambda$0(Processo.java:74)
at java.util.HashMap.forEach(HashMap.java:1289)
at br.grupopn.robo.cetelem.esteira.model.Processo.processar(Processo.java:67)
at br.grupopn.robo.cetelem.esteira.email.EmailController.lambda$0(EmailController.java:44)
at java.util.HashMap.forEach(HashMap.java:1289)
at br.grupopn.robo.cetelem.esteira.email.EmailController.processarEmails(EmailController.java:36)
at br.grupopn.robo.cetelem.esteira.app.App.main(App.java:27)
java.lang.RuntimeException: org.postgresql.util.PSQLException: Nenhum resultado foi retornado pela consulta.
at br.grupopn.robo.cetelem.esteira.model.Processo.lambda$0(Processo.java:93)
at java.util.HashMap.forEach(HashMap.java:1289)
at br.grupopn.robo.cetelem.esteira.model.Processo.processar(Processo.java:67)
at br.grupopn.robo.cetelem.esteira.email.EmailController.lambda$0(EmailController.java:44)
at java.util.HashMap.forEach(HashMap.java:1289)
at br.grupopn.robo.cetelem.esteira.email.EmailController.processarEmails(EmailController.java:36)
at br.grupopn.robo.cetelem.esteira.app.App.main(App.java:27)
Caused by: org.postgresql.util.PSQLException: Nenhum resultado foi retornado pela consulta.
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:120)
at br.grupopn.robo.cetelem.esteira.dao.PropostaDao.gravarArquivo(PropostaDao.java:39)
at br.grupopn.robo.cetelem.esteira.model.Processo.lambda$0(Processo.java:74)
… 6 more
br.grupopn.robo.cetelem.esteira.exceptions.CsvConversionException: java.lang.RuntimeException: org.postgresql.util.PSQLException: Nenhum resultado foi retornado pela consulta.
at br.grupopn.robo.cetelem.esteira.model.Processo.processar(Processo.java:104)
at br.grupopn.robo.cetelem.esteira.email.EmailController.lambda$0(EmailController.java:44)
at java.util.HashMap.forEach(HashMap.java:1289)
at br.grupopn.robo.cetelem.esteira.email.EmailController.processarEmails(EmailController.java:36)
at br.grupopn.robo.cetelem.esteira.app.App.main(App.java:27)
Caused by: java.lang.RuntimeException: org.postgresql.util.PSQLException: Nenhum resultado foi retornado pela consulta.
at br.grupopn.robo.cetelem.esteira.model.Processo.lambda$0(Processo.java:93)
at java.util.HashMap.forEach(HashMap.java:1289)
at br.grupopn.robo.cetelem.esteira.model.Processo.processar(Processo.java:67)
… 4 more
Caused by: org.postgresql.util.PSQLException: Nenhum resultado foi retornado pela consulta.
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:120)
at br.grupopn.robo.cetelem.esteira.dao.PropostaDao.gravarArquivo(PropostaDao.java:39)
at br.grupopn.robo.cetelem.esteira.model.Processo.lambda$0(Processo.java:74)
… 6 more
Fechando e-mail

Abaixo segue meu código.

public int gravarArquivo() throws SQLException {

  try(
  ResultSet rs = uow.getConnection().prepareStatement(
  		"INSERT INTO tb_importacao_arquivo ( id_importacao, str_descricao, id_status, l_concluido, str_ativo, id_usuarioinclui, dh_inclui, n_tipo )\r\n" + 
  		"    SELECT NEXTVAL('sq_tb_importacao_arquivo'), 'Teste.xlsx', 1, 'F', 'A', 1, NOW(), 0;\r\n" + 
  		"    SELECT CURRVAL('sq_tb_importacao_arquivo');")
  		.executeQuery()){
  	if (rs.next()) {
  		
  		return rs.getInt(1);
  		
  	}
  	
  }
  
  return idImportacao ;

}

Não é possível retornar o id do insert desta maneira.

Tem alguma maneira que eu consigo fazer ?

Cara, o postgres não suporta INSERT RETURNING ID.
Logo, você sempre terá que fazer um procedimento técnico não homologado (vulgo gambiarra).
Primeiro faz o insert e, em seguida, o select com os mesmos parâmetros.

Detalhe: você vai encontrar na internet a sugestão de uso do método executeUpdate, cujo retorno é um int. Porém, este retorno se refere ao número de linhas afetadas na execução de uma query. Se isso já resolver, então, use este método.

Eu tentei o executeUpdade e ele não retorna como eu quero.

Thiago, eu uso esse método pra retornar o ID, meu banco é o Postgres tbm (Funciona com MySQL tbm):

 PreparedStatement pst = conecta.conn.prepareStatement("INSERT INTO tabela (coluna) VALUES (?)", PreparedStatement.RETURN_GENERATED_KEYS);
 pst.setString(1, mod.getColuna());
 .........
 pst.executeUpdate();
 conecta.rs = pst.getGeneratedKeys();
   while (conecta.rs.next()) {
   idObj = conecta.rs.getInt(1);
   JOptionPane.showMessageDialog(null, "O ID deste cadastro é: " + idObj);
 }

EDIT:

conecta é uma instância da minha classe de conexão. ConectaBanco conecta.
idObj é uma variável do tipo inteiro: int.

Desconhecia o getGeneratedKeys

1 curtida

Nem fala, poupa uma gambiarra e tanto!

Pessoal

Consegui resolver meu problema alterando meu sql colocando um RETURNING.

public int gravarArquivo() throws SQLException {

  try (ResultSet rs = uow.getConnection().prepareStatement(
  		"INSERT INTO tb_importacao_arquivo ( id_importacao, str_descricao, id_status, l_concluido, str_ativo, id_usuarioinclui, dh_inclui, n_tipo )\r\n" + 
  		"    (SELECT NEXTVAL('sq_tb_importacao_arquivo'), 'Teste.xlsx', 1, 'F', 'A', 1, NOW(), 0) RETURNING id_importacao;")
  		.executeQuery()) {
  	if (rs.next()) {

  		return rs.getInt(1);

  	}

  }

  return idImportacao;

}

1 curtida