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;
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?
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:
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")
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")
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
Schuenemann
Não é para especificar os campos do join na query porque eles já estão (ou deveriam estar) no mapeamento.
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 = ?