Erro HQL

13 respostas
rodrigo.fai

Olá pessoal,

estou com um problema com uma query e não consigo resolver. Será que alguem conseguiria me ajudar?
A query é a seguinte:

StringBuffer sql = new StringBuffer();
        sql.append(" update Projeto set status = :status ");
        sql.append(" where acaoAtividadeDaRelacaoDeIntencao.numeroDoGrupoModular = :grupoModular ");
        sql.append(" and acaoAtividadeDaRelacaoDeIntencao.acaoAtividade.numeroDoModulo > :numeroModulo ");
        
        Query query = getSession().createQuery(sql.toString());
        query.setParameter("grupoModular", projeto.getAcaoAtividadeDaRelacaoDeIntencao().getNumeroDoGrupoModular());
        query.setParameter("numeroModulo", projeto.getAcaoAtividadeDaRelacaoDeIntencao().getAcaoAtividade().getNumeroDoModulo());
        query.setParameter("status", TipoDeStatusDoProjeto.CANCELAMENTO_ACEITO);
        query.executeUpdate();

E a mensagem de erro é a seguinte:

10:24:42,031 ERROR [JDBCExceptionReporter] ERROR: syntax error at or near ","
10:24:49,187 FATAL [DaoInterceptor      ] factory has transaction. ROLLBACK!
25/08/2009 10:24:49 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet vraptor2 threw exception
org.postgresql.util.PSQLException: ERROR: syntax error at or near ","

Diz que há um erro de sintaxe no código decorrente de uma ‘,’. Mais notem, não têm nenhuma ‘,’ no codigo HQL!

Não entendo o que está acontecendo.

13 Respostas

edmarr

Creio que os erros estao nestas duas linhas pois pelo que eu sei
e necessario refenrenciar somente o campo da tabelas eh nao o nome de toda a sua entidade .

sql.append(" where acaoAtividadeDaRelacaoDeIntencao.numeroDoGrupoModular = :grupoModular "); sql.append(" and acaoAtividadeDaRelacaoDeIntencao.acaoAtividade.numeroDoModulo > :numeroModulo ");

teste assim .

sql.append(" where numeroDoGrupoModular = :grupoModular "); sql.append(" and numeroDoModulo > :numeroModulo ");

rubensdemelo

Qual o resultado final da string?

Posta também.

rodrigo.fai

edmarr:
Creio que os erros estao nestas duas linhas pois pelo que eu sei
e necessario refenrenciar somente o campo da tabelas eh nao o nome de toda a sua entidade .

sql.append(" where acaoAtividadeDaRelacaoDeIntencao.numeroDoGrupoModular = :grupoModular "); sql.append(" and acaoAtividadeDaRelacaoDeIntencao.acaoAtividade.numeroDoModulo > :numeroModulo ");

teste assim .

sql.append(" where numeroDoGrupoModular = :grupoModular "); sql.append(" and numeroDoModulo > :numeroModulo ");

Eu tirei o nome das entidades e a vírgula sumiu realmente! Porém, é exibida outra mensagem informando que as colunas “numeroDoGrupoModular” e “numeroDoModulo” não existem!
Estas colunas não pertencem a tabela “Projeto”, são de outras tabelas relacionadas com Projeto.

edmarr

Então vc tem q fazer uma relação um join entre as tabelas , vc esta apanhando no sql verifique o relacionamento entre as tabelas antes de montar o Sql ,
Lembrando vc n precisa criar varios tópicos para um mesmo assunto .

rodrigo.fai

edmarr:
Então vc tem q fazer uma relação um join entre as tabelas , vc esta apanhando no sql verifique o relacionamento entre as tabelas antes de montar o Sql ,
Lembrando vc n precisa criar varios tópicos para um mesmo assunto .

Tente usar o join mais não deu muito certo meu amigo!
Dê uma olhada no código:

sql.append(" update Projeto as proj set proj.status = :status ");
       sql.append(" join proj.acaoAtividadeDaRelacaoDeIntencao as aari");
       sql.append(" where aari.numeroDoGrupoModular = :grupoModular ");

É exibida a seguinte mensagem de erro:

edmarr

Voce ta confundido tudo tente execultar o sql que vc deseja fazer update primeiro em uma IDE de sql ,
caso n consiga poste o relacionamento entre as tabelas . exemplo.

sql.append(" update tabela1  set status = :status ");  
sql.append(" where codigo = (select codigo from tabela2 t2 from t2.codigo = :codigo )");  
sql.append(" and grupomodular = :grupoModular ");

Lembrando vc esta errando eh a como fazer o relacionamento entre as tabelas .

rodrigo.fai

edmarr:
Voce ta confundido tudo tente execultar o sql que vc deseja fazer update primeiro em uma IDE de sql ,
caso n consiga poste o relacionamento entre as tabelas . exemplo.

sql.append(" update tabela1  set status = :status ");  
sql.append(" where codigo = (select codigo from tabela2 t2 from t2.codigo = :codigo )");  
sql.append(" and grupomodular = :grupoModular ");

Lembrando vc esta errando eh a como fazer o relacionamento entre as tabelas .

Relacionamento:

A tabela Projeto tem um relacionamento “OneToOne” com a AcaoAtividadeDaRelacaoDeIntencao, que por sua vez têm um relacionamento “ManyToOne” com a tabela AcaoAtividade.

edmarr

Tente assim .

sql.append(" update projeto  set status = :status ");  
sql.append(" where codigo = (select codigo from AcaoAtividadeDaRelacaoDeIntencao  where t2.codigo = :codigo )");  
sql.append(" and grupomodular = (select grupomodular from AcaoAtividade t3  where t3.grupomodular = :grupomodular )");

lembrando nao sei como esta a estrutura do seu banco .

rodrigo.fai

edmarr:
Tente assim .

sql.append(" update projeto  set status = :status ");  
sql.append(" where codigo = (select codigo from AcaoAtividadeDaRelacaoDeIntencao  where t2.codigo = :codigo )");  
sql.append(" and grupomodular = (select grupomodular from AcaoAtividade t3  where t3.grupomodular = :grupomodular )");

lembrando nao sei como esta a estrutura do seu banco .

A estrutura entre as tabelas? Não tenho elas em mãos! Com o relacionamento já não daria p/ me ajudar?

rodrigo.fai

edmarr:
Tente assim .

sql.append(" update projeto  set status = :status ");  
sql.append(" where codigo = (select codigo from AcaoAtividadeDaRelacaoDeIntencao  where t2.codigo = :codigo )");  
sql.append(" and grupomodular = (select grupomodular from AcaoAtividade t3  where t3.grupomodular = :grupomodular )");

lembrando nao sei como esta a estrutura do seu banco .

Por que “where codigo”? Eu preciso verificar o numeroDoGrupoModular da tabela AcaoAtividadeDaRelacaoDeIntencao e o numeroDoModulo da tabela AcaoAtividade!

edmarr

Como nao sei o relacionamento entre as suas tabelas , acho q ta na hora de vc parar eh pensar um pouquinho ( ps nao eh uma critica eh sim uma sugestão ) pois ensinei o caminho agora ir andando ai ja eh com vc .

rodrigo.fai

Mais eu postei qual é o relacionamento entra as tabelas, acho que vc nao notou!!!

É a seguinte:

A tabela Projeto tem um relacionamento “OneToOne” com a AcaoAtividadeDaRelacaoDeIntencao, que por sua vez têm um relacionamento “ManyToOne” com a tabela AcaoAtividade.

edmarr

Eu ja lhe ensinei o caminho , creio q esta na hora de vc colocar esta massa cinzenta pra funcionar pois nao tenho acesso a estrutura das suas entidades para lhe ajudar com mais clareza .

Criado 25 de agosto de 2009
Ultima resposta 26 de ago. de 2009
Respostas 13
Participantes 3