Erro consulta jpql

14 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.

14 Respostas

Rodrigo_Sasaki

o seu erro é de sintaxe, você poderia testar coisas como:

1 - Colocar parenteses na sua subtração
2 - Montar os dias via código, e adicioná-los como parâmetros na sua query

Rodrigo_Sasaki

Pra quem vier responder aqui, esse tópico é duplicado.
http://guj.com.br/java/273483-erro-consulta-jpql

L

Obrigado digaoneves, eu tinha visto que tinha criado no lugar errado, mais não sei se tem como excluir o topico criado ¬¬’

Então digaoneves eu fiz desta forma e ele executa e me traz a lista.

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

Só que eu preciso de ir em outra tabela para eu poder pegar alguns dados com join.

Algo tão simples me dando tanta dor de cabeça.rsrsrsr.

Vou dar uma pesquisa, conseguindo algo eu posto aqui. Abraços

Rodrigo_Sasaki

luis.feitoza:
Obrigado digaoneves, eu tinha visto que tinha criado no lugar errado, mais não sei se tem como excluir o topico criado ¬¬’

Então digaoneves eu fiz desta forma e ele executa e me traz a lista.

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

Só que eu preciso de ir em outra tabela para eu poder pegar alguns dados com join.

Algo tão simples me dando tanta dor de cabeça.rsrsrsr.

Vou dar uma pesquisa, conseguindo algo eu posto aqui. Abraços

Por isso que eu te dei alternativas, dependendo da implementação o seu join não vai aceitar tudo, por exemplo, dependendo da versão do EclipseLink, Join com Alias não funciona como deveria. Por isso sugiro que monte os dias na mão, e simplesmente os substitua como :parametros normais.

L

Desculpa pela demora da resposta estou enrrolado no tranpo, mais de qualquer forma um join simples funciona no jpql certo ???

tipo:

tanto assim:

select c.teste, a.teste
from Teste a , Teste c
where id_teste_a = id_teste_c

e tambem com o join igual postado acima???Porque verifiquei na documentação do JPQL é lá eles usam join.

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 ??

Rodrigo_Sasaki

o getTime() de Calendar retorna um java.util.Date, creio que você precise de um java.sql.Date

pmlm

O problema não será por estar a passar uma string para o parametro?

Porque não simplesmente

query.setParameter("pData", c);
L

Beleza, mais eu precisa passar a data como parametro formatada como essa string “yyyy-MM-dd”. Como vou fazer sem usar
um formatador ? Sendo que usando o TO_DAYS não deu muito certo ¬¬’

Rodrigo_Sasaki

você chegou a testar a sugestão do pmlm?

L

Sim, seria valida se eu tivesse a data do calendar igual a do banco. Mais a minha data no banco esta assim “yyyy-MM-dd”

pmlm

Data é data. O que muda é o formato que é apresentado, mas internamente o valor é o mesmo. Chegaste sequer a tentar?

L

Sim tentei. Mais ele não me traz nenhum resultado, mais se eu fizer igual eu fiz antes com o TO_DAY ele me traz o resultado.

L

Vou postar minhas classes onde eu faço o relacionamento delas, pois acredito que eu esteja fazendo algo de errado nos mapeamentos.

@Entity
public class Apropriar implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long idApropriacao;
	
	private Calendar data;
	
	@Valid
	@OneToOne
	private Sistema sistemaVinculado;
	
	@Valid
	@OneToOne
	private CadastroServico servicoVinculado;
	
	@Valid
	@OneToOne
	private PerfilUsuario apropriacaoPerfil;
	
	private String horasApropriadas;
@Entity
@SessionScoped
public class PerfilUsuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id 
	@GeneratedValue
	private Long idUsuario;
	
	private String login;

	private String senha;
@Entity
public class CadastroServico implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id 
	@GeneratedValue
	private Long id_servico;
	private String nome_servico;
	private String descricao;
	
	private String breveDesc;
	
	@Valid
	@ManyToOne
	private Sistema sistemaVinculado;
@Entity
public class Sistema implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue
	private Long idSistema;
	
	private String nomeSistema;
	private String descricao;
	
	@ManyToMany
	@JoinTable(name="sistema_perfilusuario", 
			joinColumns = {@JoinColumn(name="idSistema")}, 
			inverseJoinColumns = {@JoinColumn(name="idUsuario")})
	private List<PerfilUsuario> usuarios;
Criado 22 de maio de 2012
Ultima resposta 25 de mai. de 2012
Respostas 14
Participantes 3