[RESOLVIDO] erro consulta jpql

8 respostas
L

Olá Galera, estou tentando fazer uma consulta em JPQL só que está dando um erro estranho.

Segue o codigo.

public List<Apropriar> getApropriacoesHoje(){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		String jpql = " select a.horasApropriadas," +
		  " p.nome," +
		  " p.login," +
		  " a.observacao, " +
		  " s.nomeSistema," +
		  " c.nome_servico" +
		 " from Apropriar a" +
		" Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario" +
		" Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico" +
		" Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema" +
		" where TO_DAYS(NOW()) - TO_DAYS(a.data) <= 30";
		Query query = em.createQuery(jpql);
		em.close();
		return query.getResultList();
	}

Erro:

at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where TO_DAYS(NOW()) - TO_DAYS(a.data) <= 30]
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1100)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:254)
	at br.com.sisapropriacao.mb.ApropriacaoBean.getApropriacoesHoje(ApropriacaoBean.java:90)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102)
	... 37 more
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where TO_DAYS(NOW()) - TO_DAYS(a.data) <= 30]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:251)
	... 48 more
21/05/2012 12:40:48 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/SisApropriacaoRef] threw exception [org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where TO_DAYS(NOW()) - TO_DAYS(a.data) <= 30]] with root cause
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where TO_DAYS(NOW()) - TO_DAYS(a.data) <= 30]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)

Obs.: Essa consulta está executando sem erros no MYSQL.

8 Respostas

R

não tenho certeza, mas acho que o TO_DAYS não vai funcionar com JPQL, visto que é uma função específica do MySQL, não é ?

L

Não sei se ele é especifico do mysql :frowning: vou dar uma olhada aqui vou alterar essa condição e ja respondo.

L

Desculpa pelo tamanho do erro:

21/05/2012 13:29:00 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/menu.xhtml]
javax.el.ELException: /menu.xhtml @16,124 value="#{apropriacaoBean.apropriacoesHoje}": Error reading 'apropriacoesHoje' on type br.com.sisapropriacao.mb.ApropriacaoBean
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:107)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
	at javax.faces.component.UIData.getValue(UIData.java:554)
	at javax.faces.component.UIData.getDataModel(UIData.java:1248)
	at javax.faces.component.UIData.getRowCount(UIData.java:339)
	at org.primefaces.component.datatable.DataTable.calculatePage(DataTable.java:769)
	at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:160)
	at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:85)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where a.data =:pData]
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1100)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:254)
	at br.com.sisapropriacao.mb.ApropriacaoBean.getApropriacoesHoje(ApropriacaoBean.java:94)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102)
	... 37 more
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where a.data =:pData]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:251)
	... 48 more
21/05/2012 13:29:00 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/SisApropriacaoRef] threw exception [org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where a.data =:pData]] with root cause
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 164 [ select a.horasApropriadas, p.nome, p.login, a.observacao,  s.nomeSistema, c.nome_servico from br.com.sisapropriacao.modelo.Apropriar a Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema where a.data =:pData]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.j
private Date agora = new java.util.Date();


	SimpleDateFormat formatar = new SimpleDateFormat("yyyy-dd-MM");
		
		String dataFormatada = formatar.format(agora);
		
	        String jpql = " select a.horasApropriadas," +  
	          " p.nome," +  
	          " p.login," +  
	          " a.observacao, " +  
	          " s.nomeSistema," +  
	          " c.nome_servico" +  
	         " from Apropriar a" +  
	        " Inner join PerfilUsuario p on a.apropriacaoPerfil_idUsuario = p.idUsuario" +  
	        " Inner Join CadastroServico c on a.servicoVinculado_id_servico = c.id_servico" +  
	        " Inner Join Sistema s On a.sistemaVinculado_idSistema = s.idSistema" +  
	        " where a.data =:pData";  
	        Query query = em.createQuery(jpql);  
	        query.setParameter("pData",dataFormatada);
L

Então digaoneves tentei fazer uma consulta simples usando TO_DAYS deu certo, não estou conseguindo fazer o join.

from Apropriar a where TO_DAYS(NOW()) - TO_DAYS(a.data) <= 30

Como se faz um join no jpql, pelo que eu olheio na documentação e desta forma citada acima mais tenho que fazer mais alguma coisa ? Referenciar as classes que estou fazendo esse
join???

L

Alguem ?

L

Acredito que esses erros bobos só acontecem comigo…AFF

Então galera, o que acontece que estou tentando fazer uma consulta meio boba mais passando um parametro uma data.

Segue o codigo:

public List<Apropriar> getApropriacoesHoje() throws ParseException{    
        EntityManager em = new JPAUtil().getEntityManager();    
        em.getTransaction().begin();    

        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
       
        Calendar c = Calendar.getInstance();  
        s.format(c.getTime());
       
        String jpql = " from Apropriar a where a.data = :pData";    
        Query query = em.createQuery(jpql);  
        query.setParameter("pData", s.format(c.getTime()));
        em.close();    
        return query.getResultList();    
    }

O erro que está dando:

javax.servlet.ServletException: Parameter value [2012-05-23] was not matching type [java.util.Calendar] javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

Já tentei passar somente c.getTime() e continua dando a mesma exceção…Alguem sabe o motivo ??

M

Essa mensagem de erro do Hibernate:

unexpected token: on near line

Significa que o “ON” do seu join não é suportado, use essa sintaxe quando usar SQL apenas.

Na JPA os joins são feitos no modelo de orientação à objetos, ou seja, você precisa mapear o relacionamento antes na classe modelo, para fazer buscas com join usando JPQL/HQL.

Se quiser de qualquer forma usar SQL, dê uma olhada: http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/query_native.html#d0e4753

L

Obrigado pela resposta, e desculpa pela demora mais eu já conseguir resolver a um tempo :blush:

Segue:

select p from Apropriar p where p.dataApropriacao = ? and p.apropriacaoPerfil.gerenciaVinculado = ?

Obrigado a todos.

Criado 21 de maio de 2012
Ultima resposta 3 de out. de 2012
Respostas 8
Participantes 3