Veja qual foi o SQL que foi disparado pelo Hibernate ativando o show_sql.
Pra fazer isso, vá no seu arquivo de configuração (se for xml) e coloque a linha:
Se for o de properties tb funciona (claro, sem as tags).
Depois posta ai o select que aparecer no console.
edmarr
Você n precisa abrir 2 tópicos para o mesmo assunto , aguarde logo logo um usuário do fórum o respondera .
rodrigo.fai
riccaio:
Veja qual foi o SQL que foi disparado pelo Hibernate ativando o show_sql.
Pra fazer isso, vá no seu arquivo de configuração (se for xml) e coloque a linha:
Se for o de properties tb funciona (claro, sem as tags).
Depois posta ai o select que aparecer no console.
Olha só que estranho cara! Não é que aparece uma vírgula no código SQL:
update
Projeto,
set
status=?
where
numeroDoGrupoModular=?
and numeroDoModulo>?
17:29:11,796 ERROR [JDBCExceptionReporter] ERROR: syntax error at or near ","
Está não cara! A minha anotação está normal, sem a vírgula!
R
riccaio
Vc está usando xml ou anotações?
E faça um teste simples, uma consulta bem boba e veja qual select aparece. Algo assim:
Query query = session.createQuery("from Projeto where id < 1");
query.list();
Isso tb dá erro?
rodrigo.fai
riccaio:
Vc está usando xml ou anotações?
E faça um teste simples, uma consulta bem boba e veja qual select aparece. Algo assim:
Query query = session.createQuery("from Projeto where id < 1");
query.list();
Isso tb dá erro?
Estou usando anotações!
leoramos
Usa PreparedStatement e coloca alias (Produto p). O ‘from’ é opcional, mas convém colocar, pois quando tu colocas o From ele limita a só uma, então talvez ele não ponha a vírgula. Não testei aqui, mas acho que funciona.
Abraço!
UPDATE:
Em alguns sites em inglês o pessoal estava tentando resolver isso trocando o driver utilizado para conexão, mas nenhum apontou o resultado. E lembre-se, é claro, de usar o alias também nos itens da cláusula where - p.grupoModular, assim por diante).
(Desculpa se eu falo demais)
leoramos
Opa, vi tuas msgs na outra thread. Tu tá usando Spring, por acaso, não?
Abraço!
rodrigo.fai
leoramos:
Usa PreparedStatement e coloca alias (Produto p). O ‘from’ é opcional, mas convém colocar, pois quando tu colocas o From ele limita a só uma, então talvez ele não ponha a vírgula. Não testei aqui, mas acho que funciona.
Abraço!
UPDATE:
Em alguns sites em inglês o pessoal estava tentando resolver isso trocando o driver utilizado para conexão, mas nenhum apontou o resultado. E lembre-se, é claro, de usar o alias também nos itens da cláusula where - p.grupoModular, assim por diante).
(Desculpa se eu falo demais)
O erro está no Update que estou tentando fazer! Se não me engano, cláusulas FROM não são utilizados quando fazemos um UPDATE!?
rodrigo.fai
leoramos:
Opa, vi tuas msgs na outra thread. Tu tá usando Spring, por acaso, não?
Abraço!
Não, estou usando vRaptor!
leoramos
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?
leoramos
Sendo bem sincero?
“Updates” e “Deletes” diretos não são muito a cara do Hibernate. É um dos casos que me faz não gostar muito dele, na verdade… nessas horas HQL é um atraso de vida.
Eu usaria nativeQuery, coice no peito mesmo. Perde-se algo de portabilidade (apesar de que nessa sintaxe aí, eu duvido muito), mas economiza dinheiro de aspirina.
rodrigo.fai
leoramos:
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?
Vc têm algum exemplo aí com update usando from p/ postar?
Sim! Somente o atributo que será setado é da classe!!!
leoramos
Cara, exemplo não tenho, mas coloca ele antes do nome da entidade, nada demais. Não lembro a versão da documentação que eu vi, eu tenho todas aqui e não vi qual eu abri o.0 mas não deve variar isso não… eu “acho”.
Com SQL nativa é mole… mas me diz, como estás acessando os outros atributos? Posta o teu mapeamento (as classes, no caso) pra gente conferir, ao que parece pelo respondido na outra thread, é algo a ser revisto.
rodrigo.fai
leoramos:
Cara, exemplo não tenho, mas coloca ele antes do nome da entidade, nada demais. Não lembro a versão da documentação que eu vi, eu tenho todas aqui e não vi qual eu abri o.0 mas não deve variar isso não… eu "acho".
Com SQL nativa é mole… mas me diz, como estás acessando os outros atributos? Posta o teu mapeamento (as classes, no caso) pra gente conferir, ao que parece pelo respondido na outra thread, é algo a ser revisto.
Coloquei o "from" antes da entidade e continua dando erro!
O código ficou assim depois da alteração:
sql.append(" update from Projeto as proj set proj.status = :status ");
sql.append(" where proj.acaoAtividadeDaRelacaoDeIntencao.numeroDoGrupoModular = :grupoModular ");
sql.append(" and proj.acaoAtividadeDaRelacaoDeIntencao.acaoAtividade.numeroDoModulo > :numeroModulo ");
R
riccaio
leoramos:
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?
Vc está dizendo que pode ser feito um select sem o from? Como ficaria? Eu acho que isso não é possível.
O que vc pode tirar é o select, e não o from. A não ser que vc esteja falando de um update, que pode ser feito com hql tb.
session.createQuery("update Produto p set p.nome='a' where id = 1").executeUpdate();
O select ficaria assim:
session.createQuery("from Produto p where p.id = 1").list();
Eu me esqueci de colocar o alias e depois usar ele no where.
leoramos
riccaio:
leoramos:
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?
Vc está dizendo que pode ser feito um select sem o from? Como ficaria? Eu acho que isso não é possível.
O que vc pode tirar é o select, e não o from. A não ser que vc esteja falando de um update, que pode ser feito com hql tb.
session.createQuery("update Produto p set p.nome='a' where id = 1").executeUpdate();
O select ficaria assim:
session.createQuery("from Produto p where p.id = 1").list();
Eu me esqueci de colocar o alias e depois usar ele no where.
Não, não foi isso que eu quis dizer não… é que vi um lance sobre limitação de entidade usando ‘from’ para updates na documentação do maledeto do Hibernate, não tem nada a ver com select não.
Como eu falei, para o caso acima eu usaria SQL nativo.
R
riccaio
Mas por que usar sql nativo pra um update? Eu não vejo vantagens. Eu prefiro usar o sql nativo quando for alguma coisa muito específica ou quando eu precisar de muita performance.
leoramos
Dá uma olhada na documentação do hibernate sobre update em lote, o material é bem rico nesse sentido. A própria documentação assume que updates dessa forma pelo hibernate são mancos.
R
riccaio
Eu não achei na documentação onde diz que update em lote são “mancos”.
Vc poderia me mandar o link de onde vc viu isso?
leoramos
É um pdf, cara… e ‘manco’ foi maneira de dizer, né? hehe
Eu cato no meio desse monte de pdfs.
(mas sim, updates e deletes em lotes sequer são o foco do hibernate, isso já é sabido de longa data)
R
riccaio
Eu sei que “manco” foi maneira de dizer. Por isso que eu coloquei entre aspas o que vc disse.
Cara, eu procurei na documentação e no google e não achei nada falando que as operações em batch são problemáticas.
Se vc achar o link ou alguma coisa dizendo, por favor mande ai.
leoramos
Não é que são problemáticas, é só que não é o foco do Hibernate, então nada é 100% ‘correto’, digamos assim.
O que tem de melhor ou mais aceito é porquê virou padrão de fato, por uso. Manual do Hibernate tem isso, versão 3.
Abraço!
Dá uma lida exatamente no link que me passasse.
A especificação prevê update em lote para apenas uma classe (o que significa, por exemplo, que instruções update que necessitem selects em outra tabela na cláusula where já não funcionam).
Entendeu o que eu quis dizer que ‘não é o foco’? O update e delete no hibernate servem para alterar estados de uma entidade no banco. O que é feito em lote, inclusive, é muito menos eficiente (falando de velocidade) que fazer o SQL no braço.
R
riccaio
Ainda não entendi o que vc quis dizer com não é o foco. O Hibernate implementa a JPA, uma especificação.
Quando vc diz que o “update e delete no hibernate servem para alterar estados de uma entidade no banco”, é isso mesmo que ele tem que fazer, alterar o banco.
E por que com HQL seria menos eficiente que SQL? O HQL gera SQL, normal.
leoramos
Eu sei disso… mas acho que tu não pegou o conceito.
Alterar o estado da entidade NÃO É equivalente a alterar o banco.
O SQL que o Hibernate gera a partir da HQL nem sempre é igual ao SQL mais performático que terias. Sugiro que leias a especificação e a documentação do Hibernate, vai ficar mais clara a diferença pra ti. Não tá fluindo, pelo visto.
Abraço!
R
riccaio
Em nenhum momento eu falei que alterar a base é a mesma coisa que alterar o estado lógico de objetos.
Eu falei que quando vc dispara um hql com uma operação em batch, ele tem que atualizar a base.
Eu concordo com vc que isso não irá alterar os estados dos objetos que o hibernate gerencia.
Eu tb sei que o sql que o Hibernate gera nem sempre é igual ao SQL mais performático, mas para operações de update e delete geralmente não vai ter muita diferença (não que eu saiba). Se fosse select eu concordaria com vc.
Eu leio sim a documentação e a especificação, e ainda acho que o que estou falando está correto.