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.
E
edmarr
Você n precisa abrir 2 tópicos para o mesmo assunto , aguarde logo logo um usuário do fórum o respondera .
R
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?
R
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!
L
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)
L
leoramos
Opa, vi tuas msgs na outra thread. Tu tá usando Spring, por acaso, não?
Abraço!
R
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!?
R
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!
L
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é?
L
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.
R
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!!!
L
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.
R
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.
L
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.
L
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?
L
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.
L
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.
L
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.