Boa Tarde Galera!
Gostaria de saber a maneira correta de executar essa query,pois pelo erro que recebo já sei que está incorreta.
obrigada! :)
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 240
@SuppressWarnings("unchecked")publicCollection<Servidor>obterPorSetor(Servidorservidor,Stringsigla)throwsAplicacaoException{Sessionsession=SessionFactoryUtil.getInstance().getCurrentSession();Collection<Servidor>lista=null;try{tx=session.beginTransaction();Queryquery=session.createQuery(" SELECT DISTINCT Servidor.CD_SERVIDOR AS codigo ,UnidadeOrganizacional.sg_unidade_organiz AS sigla ,"+"Servidor.NM_SERVIDOR AS nome , Servidor.CD_MATRIC_SIAPE AS MATRICULA FROM crp_servidor AS Servidor "+"INNER JOIN crp_cargo_servidor AS Cargo ON Cargo.cd_servidor = Servidor.cd_servidor "+"INNER JOIN crp_ocorrencia AS Ocorrencia ON Servidor.cd_servidor = Ocorrencia.cd_servidor "+"INNER JOIN crp_unidade_organi AS UnidadeOrganizacional ON Servidor.cd_unidade_organiz = UnidadeOrganizacional.cd_unidade_organiz "+"WHERE Servidor.cd_situacao_servidor IN ( '01', '04') "+"AND UnidadeOrganizacional.sg_unidade_organiz=? "+"AND Ocorrencia.cd_tipo_ocorrencia "+"AND Cargo.dt_saida_cargo IS NULL ");query.setString(0,sigla);lista=(Collection<Servidor>)query.list();tx.commit();}catch(RuntimeExceptione){thrownewAplicacaoException(e.getMessage(),e);}returnlista;}
vc não precisa dar espaço entre a virgula e o atributo
forma errada:
SELECT DISTINCT Servidor.CD_SERVIDOR AS codigo ,UnidadeOrganizacional.sg_unidade_organiz AS sigla
forma correta:
SELECT DISTINCT Servidor.CD_SERVIDOR AS codigo, UnidadeOrganizacional.sg_unidade_organiz AS sigla
observe a posição da virgula. Preciso que vc poste sua classe de conexão com o banco "SessionFactoryUtil" preciso comparar algumas coisas. OK!
bjs.
monike
Oie, obrigada pela atenção!
Ajeitei o espaço entre os atributos,mas o erro continua.
Minha classe:
importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.AnnotationConfiguration;publicclassSessionFactoryUtil{/** The single instance of hibernate SessionFactory */privatestaticorg.hibernate.SessionFactorysessionFactory;/** * disable contructor to guaranty a single instance */privateSessionFactoryUtil(){}static{// Annotation and XMLsessionFactory=newAnnotationConfiguration().configure().buildSessionFactory();// XML only// sessionFactory = new// Configuration().configure().buildSessionFactory();}publicstaticSessionFactorygetInstance(){returnsessionFactory;}/** * Opens a session and will not bind it to a session context * * @return the session */publicSessionopenSession(){returnsessionFactory.openSession();}/** * Returns a session from the session context. If there is no session in the * context it opens a session, stores it in the context and returns it. This * factory is intended to be used with a hibernate.cfg.xml including the * following property <property * name="current_session_context_class">thread</property> This would return * the current open session or if this does not exist, will create a new * session * * @return the session */publicSessiongetCurrentSession(){returnsessionFactory.getCurrentSession();}/** * closes the session factory */publicstaticvoidclose(){if(sessionFactory!=null&&!sessionFactory.isClosed())sessionFactory.close();sessionFactory=null;}}
hvivox
Esqueci de comentar: quando vc utiliza hibernate especificamente com reateQuery na verdade vc de deixa de trabalhar com sql e passa a trabalhar com hql em que a sitaxe de é diferente veja o exemplo de minha consulta
publicListprocurarPorData(StringdataInicial,StringdataFinal,StringuniOperacional){session=ConnectDB.getInstance();Transactiontx=session.beginTransaction();/*Consulta para buscar os dados. (:) isto � para que o HQL identifique qual � o parametro de entrada*//*Esta clausula utiliza os objetos do V.O por isso tem que ser case sencitive para n�o ocorrer erro*/Queryselect=session.createQuery("Select regVis.Reg_codigo, vis.Vis_nome, setor.Set_nome, uniOp.Uni_nome, "+"regVis.Reg_status, regVis.Reg_horaEntrada, "+"regVis.Reg_horaSaida, regVis.Reg_dataVisita, regVis.Reg_usuarioLogado "+"FROM RegistrarVisita regVis inner join regVis.setor setor inner join setor.uniOp uniOp inner join "+"regVis.visitante vis inner join regVis.colaborador colab "+"); //atribui um valor de entrada no parametro neste caso o valor da entrada s�o mostrados abaixo.select.setString("uniOperacional",uniOperacional).setString("dataInicial",dataInicial).setString("dataFinal",dataFinal);Listlist=select.list();tx.commit();session.close();returnlist;}//fim
Qual o banco que vc está utilizando? se vc quiser utilizar a linguagem nativa do banco vai ter que fazer assim:
Query select = session.createSQLQuery(
bjs
muito obrigado pela classe enviada estou bolando a classe de conexão perfeita para utilização
monike
Exatamente,já tentei usar sql nativa.Mas tb nao funcinou.
Na verdade essa query aqui vai beleza.Mas o problema é que entrou mais duas condiçoes de mais duas tabelas diferentes. A tabela de cargo e unidade,essas duas tabelas já estao mapeadas no .xml e seus respectivos modelos com os relacionamentos.
Ex: AND OCORRENCIA.cd_tipo_ocorrencia
AND CARGO.dt_saida_cargo IS NULL
publicCollection<Servidor>obterPorSetor(Servidorservidor,Stringsigla)throwsAplicacaoException{Sessionsession=SessionFactoryUtil.getInstance().getCurrentSession();Collection<Servidor>lista=null;try{tx=session.beginTransaction();[b]Queryquery=session.createQuery(" from Servidor s where s.unidadeOrganizacional.sigla = ? and s.situacao IN ( '01', '04')");[/b]query.setString(0,sigla);lista=(Collection<Servidor>)query.list();tx.commit();}catch(RuntimeExceptione){thrownewAplicacaoException(e.getMessage(),e);}returnlista;}