Stmt.executeUpdate?

Pessoal eu faço um update no PGADMIN 3 funciona perfeitamente, mas quando faço isso usando stmt.executeUpdate não funciona, segue o cóidigo:

private Connection getConexao() throws SQLException, ClassNotFoundException { Connection con = null; try { Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql://192.168.1.11:5432/nutec"; String usuario = "root"; String senha = "debian23"; con = (Connection) DriverManager.getConnection(url, usuario, senha); } catch (SQLException sql) { System.out.println("erro ao conectar"); //sql.printStackTrace(); } return con; }

public void atualizaditalq(Solicitacao solicitacao) throws SQLException, ClassNotFoundException { Transaction tx = session.beginTransaction(); solicitacao.setSoliStatusSolicitacaoNome("RETORNO DA DIVISÃO PARA CAC - 2"); solicitacao.setSoliStatusSolicitacaoLocal("DITALQ"); solicitacao.setSoliServicosDitalq("Sim"); Connection con = getConexao(); // Chama a classes de conecção Statement stmt = con.createStatement(); //este UPDATE insere a soma total dos servicos em soliSomaServicos stmt.executeUpdate("UPDATE sigi.solicitacao SET soli_soma_servicos = " + "(SELECT sum(solicitacao.soli_soma_servicos + (servicos.serv_preco * intermediariasolicitacao.inte_quantidade)) " + "FROM sigi.intermediariasolicitacao, sigi.servicos " + "WHERE intermediariasolicitacao.inte_fk_solicitacao_id = " + solicitacao.getSoliPkId() + " AND intermediariasolicitacao.inte_fk_servico_id = servicos.serv_pk_id); " + "WHERE solicitacao.soli_pk_id = " + solicitacao.getSoliPkId()); tx.commit(); }

Mostra algum erro, ou somente não realiza o update ?

Na linha 13 você coloca um “;” isso só deve ser feito ao finalizar a query, não é verdade ?

E mais uma coisa, no seu método de pegar a conexão você se conecta ao banco de nome “nutec”, porém ao fazer o update você pega a tabela solicitacao do banco “sigi”, tira esse sigi desse trecho e também dos from, que a propósito estão fazendo um pseudo join …

rodrigocolasso Boa tarde tudo bom ?

Amigão isso mesmo, não da erro algum nem retorna o valor,

solicitacao.setSoliStatusSolicitacaoNome("RETORNO DA DIVISÃO PARA CAC - 2"); solicitacao.setSoliStatusSolicitacaoLocal("DITALQ"); solicitacao.setSoliServicosDitalq("Sim");

isto aqui ele seta no banco o SQL nao !

obrigado.

13 ja apaguei o ;… ficou do mesmo modo…

Você viu que eu editei meu último post ? :smiley:

[quote=rodrigocolasso]Mostra algum erro, ou somente não realiza o update ?

Na linha 13 você coloca um “;” isso só deve ser feito ao finalizar a query, não é verdade ?

E mais uma coisa, no seu método de pegar a conexão você se conecta ao banco de nome “nutec”, porém ao fazer o update você pega a tabela solicitacao do banco “sigi”, tira esse sigi desse trecho e também dos from, que a propósito estão fazendo um pseudo join …[/quote]

public void atualizanit(Solicitacao solicitacao) throws SQLException, ClassNotFoundException { Transaction tx = session.beginTransaction(); solicitacao.setSoliStatusSolicitacaoNome("RETORNO DA DIVISÃO PARA CAC - 2"); solicitacao.setSoliStatusSolicitacaoLocal("NIT"); solicitacao.setSoliServicosNit("Sim"); Connection con = getConexao(); // Chama a classes de conecção Statement stmt = con.createStatement(); //este UPDATE insere a soma total dos servicos em soliSomaServicos stmt.executeUpdate("UPDATE sigi.solicitacao SET soli_soma_servicos = " + "(SELECT sum(solicitacao.soli_soma_servicos + (servicos.serv_preco * intermediariasolicitacao.inte_quantidade)) " + "FROM intermediariasolicitacao, servicos " + "WHERE intermediariasolicitacao.inte_fk_solicitacao_id = " + solicitacao.getSoliPkId() + "AND intermediariasolicitacao.inte_fk_servico_id = servicos.serv_pk_id) " + "WHERE solicitacao.soli_pk_id = " + solicitacao.getSoliPkId()); this.session.update(solicitacao); tx.commit(); }

Se eu fazer isso, da um erro :

e tbm da erro quando faço assim no pgadmin 3 !

valeu.

Blz, então coloca de volta :smiley: e quanto ao nome do banco alguma coisa ? Eu vi que você colocou thi.session.update(); você vai utilizar o hibernate ?

[quote=juniorsatanas] public void atualizanit(Solicitacao solicitacao) throws SQLException, ClassNotFoundException { Transaction tx = session.beginTransaction(); solicitacao.setSoliStatusSolicitacaoNome("RETORNO DA DIVISÃO PARA CAC - 2"); solicitacao.setSoliStatusSolicitacaoLocal("NIT"); solicitacao.setSoliServicosNit("Sim"); Connection con = getConexao(); // Chama a classes de conecção Statement stmt = con.createStatement(); //este UPDATE insere a soma total dos servicos em soliSomaServicos stmt.executeUpdate("UPDATE sigi.solicitacao SET soli_soma_servicos = " + "(SELECT sum(solicitacao.soli_soma_servicos + (servicos.serv_preco * intermediariasolicitacao.inte_quantidade)) " + "FROM intermediariasolicitacao, servicos " + "WHERE intermediariasolicitacao.inte_fk_solicitacao_id = " + solicitacao.getSoliPkId() + "AND intermediariasolicitacao.inte_fk_servico_id = servicos.serv_pk_id) " + "WHERE solicitacao.soli_pk_id = " + solicitacao.getSoliPkId()); this.session.update(solicitacao); tx.commit(); }

Se eu fazer isso, da um erro :

e tbm da erro quando faço assim no pgadmin 3 !

valeu.[/quote]

E você viu que na linha 13 você não colocou um espaço antes no AND? Mesmo assim da o erro ?

não esse update era para o Sim…

Quando eu eu uso : stmt.executeQuery funciona mas retorna um erro.
Quando eu uso : stmt.executeUpdate não funciona e nao retorna nada…

que desgraça !

Olá, Rodrigo

“nutec” é o nome do banco e “sigi” é o nome do schema.

Uma forma disso funcionar é, ao invés de UPDATE, fazer um SELECT usando stmt.executeQuery e setar o campo
solicitacao.soliSomaServicos com o valor desse retorno, no entanto o retorno do SELECT é do tipo ResulSet, mas o tipo
do campo soliSomaServicos é double, então é preciso converter ResultSet para double.

Existe algum método que faça essa conversão de ResultSet para double?

O método executeUpdate retorna um int, que é o número de registros afetados. No update de um registro (pela PK), evidentemente esse valor deve ser 1. Confira o que está retornando. Se vier 1, então continue lendo… :slight_smile:

[quote=JonRocha]Uma forma disso funcionar é, ao invés de UPDATE, fazer um SELECT usando stmt.executeQuery e setar o campo
solicitacao.soliSomaServicos com o valor desse retorno, no entanto o retorno do SELECT é do tipo ResulSet, mas o tipo
do campo soliSomaServicos é double, então é preciso converter ResultSet para double.
Existe algum método que faça essa conversão de ResultSet para double?[/quote]

Com certeza esse é o método mais adequado, por dois motivos:

  1. É meio zuado ficar misturando o uso do hibernate com execução de queries via jdbc. Mesmo quando uma consulta específica não puder ser feita automaticamente, utilize o recurso de query nativa do próprio hibernate.
  2. Provavelmente é a causa do problema: a query faz update mas logo em seguida é feito um update na entidade usando um objeto que já estava carregado anteriormente! A não ser que a implementação do hibernate dê um jeito (não sei como funciona nesse caso), o segundo update vai “matar” o primeiro.

Sobre a conversão do Resultset: a consulta usando NativeQuery do hibernate resolveria isso, retornando diretamente o tipo correto.

E pra terminar só mais uma frescurinha: tente deixar essa consulta/cálculo do valor em um método separado, separaria melhor as responsabilidades.

gomesrod

È eu concordo, tem que separar isso, ou melhor usar Critéria para fazer isso, pois assim o HIBERNATE gerencia tudo !

abraço.