NamedQuery erro

11 respostas
luci.al

Olá!
preciso de ajuda com uma namedQuery…no Mysql ela roda mas quando coloco no namedQuery da erro.
NamedQuery:

NamedQuery(name = "Cliente.lol", query="SELECT c FROM Cliente c INNER JOIN endereco e ON c.Endereco_idEndereco=e.idEndereco INNER JOIN localidade l ON e.localidade_idlocalidade=l.idlocalidade WHERE e.localidade_idlocalidade=?1 ORDER BY c.nome"),
sql:

SELECT * FROM Cliente c INNER JOIN endereco e ON c.Endereco_idEndereco=e.idEndereco INNER JOIN localidade l ON e.localidade_idlocalidade=l.idlocalidade WHERE e.localidade_idlocalidade=1 ORDER BY c.nome;

onde estou errando?

11 Respostas

nel

Isso não é uma dúvida de Java básico hein, fica a dica ok?
Sobre o seu problema, em qual contexto estamos falando? Está usando alguma anotation JPA?

Poste a classe com o seu código, fica melhor. E sobre erro, qual erro você se refere? Está errada a query? Gera exceção?
O que? :slight_smile:

luci.al

estou utilizando JPA

da erro de syntax:

Exception Description: Syntax error parsing the query [Cliente.lol: SELECT c FROM Cliente c INNER JOIN endereco e ON c.Endereco_idEndereco=e.idEndereco INNER JOIN localidade l ON e.localidade_idlocalidade=l.idlocalidade WHERE e.localidade_idlocalidade=?1 ORDER BY c.nome].
meu metodo generico:

public List<T> find(String sql,int parametroA) { try { criarConexao(); entityTransaction.begin(); Query query = getEntityManager().createNamedQuery(sql); query.setParameter(1, parametroA); List<T> lista = query.getResultList(); return lista; } catch (Exception e) { e.printStackTrace(); } return null; }
nao consigo encontrar o erro…o estranho é que funciona no sql.

nel

Esta linha está correta? e.localidade_idlocalidade=?1

O ?1 vai te gerar erro pois pode considerar como sendo um único atributo.
Dá um print na sua String ‘sql’ e veja o conteúdo dela. O conteúdo de ‘sql’ deve ser exclusivamente o nome da Query que pretendes usar.

luci.al

acho que nao.
é com isso que meu método generico encontra onde inserir o parâmetro.
se eu tivesse 2 paramentos:

query.setParameter(1, parametroA); query.setParameter(2,parametroB);
minha query teria que ter dois identificadores:

SELECT C FROM ENTIDADE WHERE parametro=?1 AND outroParametro=?2

ou estou errada?

nel

Sim, está. Como estamos falando em JPA, o ideal é atribuir nomes e depois setar, veja:

NamedQuery(name = "Cliente.lol", query="SELECT c FROM Cliente c INNER JOIN endereco e ON c.Endereco_idEndereco=e.idEndereco INNER JOIN localidade l ON e.localidade_idlocalidade=l.idlocalidade WHERE e.localidade_idlocalidade=:locale ORDER BY c.nome")

Agora, para buscar, basta fazer:

Query query = getEntityManager().createNamedQuery(sql); query.setParameter("locale", parametroA);

Caso contrário, ele não vai conseguir converter essa JPQL (acho que é esse o nome, “fugiu” agora) em uma SQL Query.
Abraços.

pmlm

Isso é uma native quey?

luci.al

nel:
Sim, está. Como estamos falando em JPA, o ideal é atribuir nomes e depois setar, veja:

NamedQuery(name = "Cliente.lol", query="SELECT c FROM Cliente c INNER JOIN endereco e ON c.Endereco_idEndereco=e.idEndereco INNER JOIN localidade l ON e.localidade_idlocalidade=l.idlocalidade WHERE e.localidade_idlocalidade=:locale ORDER BY c.nome")

Agora, para buscar, basta fazer:

Query query = getEntityManager().createNamedQuery(sql); query.setParameter("locale", parametroA);

Caso contrário, ele não vai conseguir converter essa JPQL (acho que é esse o nome, “fugiu” agora) em uma SQL Query.
Abraços.

Desculpe a demora…tive que ir para faculdade e hj de manha fui para o estagio…
mas assim meu metodo deixa de ser generico…
do jeito que estou fazendo funciona…so da erro quando coloco o inner join.

@NamedQuery(name="Usuario.Logar",query="SELECT a FROM Usuario a WHERE a.login=?1 AND a.senha=?2")

assim funciona mas quando coloco o inner join da erro de syntax

nel

Eu, sinceramente, nunca vi a combinação de “?1” nem em JPA ou JDBC.
Em JDBC, a ordem segue o que tu fez na query. o 1 é o primeiro ?, o 2 o segundo e assim sucessivamente.

Retire o número e deixe apenas o ‘?’, talvez funcione.
Abraços.

S

Não é para especificar os campos do join na query porque eles já estão (ou deveriam estar) no mapeamento.

Seria algo do tipo:

select cl from Cliente cl
join cl.endereco end
where end.localidade = ?
luci.al

os numeros representam o primeiro parametro INT do setParameter

query.setParameter(1, parametroA); query.setParameter(2,parametroB);

tentei colocar só a interrogação mas gera a mesma exceção.
vou fazer uma busca de novo para ver se eu encontro a resposta mas de qualquer forma obrigada.

luci.al

Schuenemann:
Não é para especificar os campos do join na query porque eles já estão (ou deveriam estar) no mapeamento.

Seria algo do tipo:

select cl from Cliente cl join cl.endereco end where end.localidade = ?

realmente… dei uma pesquisada na documentação, achei isso:
http://docs.oracle.com/cd/E28613_01/apirefs.1211/e24396/ejb3_langref.html#ejb3_langref_inner_joins

vou tentar…obrigada

Criado 12 de março de 2012
Ultima resposta 13 de mar. de 2012
Respostas 11
Participantes 4