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 ?
[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 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…
[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:
- É 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.
gomesrod
È eu concordo, tem que separar isso, ou melhor usar Critéria para fazer isso, pois assim o HIBERNATE gerencia tudo !
abraço.