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 …
juniorsatanas
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.
juniorsatanas
13 ja apaguei o ;… ficou do mesmo modo…
rodrigocolasso
Você viu que eu editei meu último post ?
rodrigocolasso
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 …
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.
rodrigocolasso
Blz, então coloca de volta e quanto ao nome do banco alguma coisa ? Eu vi que você colocou thi.session.update(); você vai utilizar o hibernate ?
rodrigocolasso
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.
E você viu que na linha 13 você não colocou um espaço antes no AND? Mesmo assim da o erro ?
juniorsatanas
não esse update era para o Sim…
juniorsatanas
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 !
J
JonRocha
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?
gomesrod
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…
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?
Com certeza esse é o método mais adequado, por dois motivos:
É 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.
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.
juniorsatanas
gomesrod
È eu concordo, tem que separar isso, ou melhor usar Critéria para fazer isso, pois assim o HIBERNATE gerencia tudo !