To com um problema aqui e acho que não estou fazendo a query corretamente. Tenho a seguinte Named Query:
@NamedQuery(name = "Estado.findLikeNomeEstadoAndIdPais", query = "SELECT e FROM Estado e WHERE e.nomeEstado LIKE :nomeEstado AND e.idPais = :idPais ORDER BY e.nomeEstado")
Chamo ela da seguinte forma:
public List ListaEstados(String NomeEstado, Integer idPais) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("Vestibulando_ManagerPU");
EntityManager em = emf.createEntityManager();
List<Estado> result = null;
try {
result = em.createNamedQuery("Estado.findLikeNomeEstadoAndIdPais")
.setParameter("nomeEstado", "%" + NomeEstado+ "%")
.setParameter("idPais", idPais)
.getResultList();
} catch (Exception e) {
e.printStackTrace();
}
return (result);
}
NomeEstado valendo M
idPais valendo 1 (1 é Brasil)
Se removo a parte do AND funciona perfeitamente sem considerar o Pais, mas com o AND da o seguinte erro:
java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.Integer for parameter idPais with expected type of class modelo.Pais from query string SELECT e FROM Estado e WHERE e.nomeEstado LIKE :nomeEstado AND e.idPais = :idPais ORDER BY e.nomeEstado.
Voltando ao caso do Erro, pelo que entendi ele esta esperando uma passagem do tipo modelo.Pais mas estou mandando um Int, tentei criar um objeto pais, buscar ele com em.find e passar mas da erro na linha e nem compila. Alguém ajuda?
Ps.: Isso é considerado Java Avançado mesmo? Se for algum Moderador pode mover para a área correta?
Mas se você não sabe como usar SQL puro ou JDBC, como pretende aprender JPA?
Quando você aprendeu a andar, já saiu correndo? Não, você deu passos pequenos, caiu, levantou, só depois começou a correr.
E não é java básico, pelo visto você sequer leu a descrição do que cada fórum permite, não é mesmo? O correto teria sido abrir um tópico no fórum de persistência.
Desculpe a todos que ofendi abrindo esse tópico. desculpe mesmo. Deletem ai. Vou resolver por aqui. Esse tópico foi triste, ajudar ninguem ajudou, mas off-topic e afins teve aos montes.
[quote=rcmatias]Desculpe a todos que ofendi abrindo esse tópico. desculpe mesmo. Deletem ai. Vou resolver por aqui. Esse tópico foi triste, ajudar ninguem ajudou, mas off-topic e afins teve aos montes.
Obrigado comunidade.[/quote]
Além de tudo é arrogante.
Ninguém é obrigado a responder a um sujeito que não se dá ao trabalho de pesquisar, de ler as regras do fórum e adaptar-se à realidade que existe aqui. Você é quem está entrando na comunidade, deve seguir no ritmo dela e não tentar forçar a amizade e impor o que você quer e espera.
Reveja teus conceitos, aprenda JDBC, estude JPA (e não apenas copie e cole exemplos) e então você verá que o erro que está cometendo é ridículo.
Eu pedi desculpas, solicitei que deletassem porque esta na área errada.
Copiei e colei códigos? Oo até agora não fiz isso mas td bem.
Digo que foi triste porque não é o primeiro Tópico que abro nessa área, sobre uma dúvida sobre JPA, mas é o primeiro onde ao invés de não me responderem ou “dizerem não sei, talvez estude isto” recebo um sermão, dizendo que devo usar SQL puro primeiro, se for pra usar o SQL puro eu faço en outra linguagem, vim tentar o JAVA fazendo um projeto pessoal justamente pelo JPA, tenho tudo funcionando ate agora exceto o AND.
Mas realmente não é arrogancia, é um pedido de desculpas! Desculpe pela área errada. Desculpe por ter uma dúvida que é boba aos olhos de alguns. Desculpe se impus algo.
Realmente foi um tópico triste pra mim, abri ele ontem a noite, com sono depois de estar mexendo a boa parte do tempo no mesmo erro, pesquisando a ermo. Mas tudo bem.
Se alguem puder me ajudar eu agradeço, se não, desculpe o tópico errado.
Se eu não conseguir a resposta com minhas próprias pernas hoje, eu posto no lugar certo. Realmente considerei ser básico.
Antes de postar, por que não lê a definição dos fóruns? Isso, no meu ponto de vista, é preguiça. Se tivesse lido, iria saber que java básico se refere à dúvidas de estrutura da linguagem, configuração e afins. Já Persistência engloba JPA, que não é java básico nem aqui nem na Mandchúria.
Agora, o problema não é apenas sair usando o JPA, é que se você soubesse o que está fazendo com SQL puro, já teria resolvido isso. Aliás, como pretende fazer quando precisar utilizar um subselect com outer left join, no JPA? É por isso que é imprescindível estudar o básico para depois partir para um framework.
E quanto ao teu problema, você tem o erro
You have attempted to set a value of type class java.lang.Integer for parameter idPais with expected type of class modelo.Pais
Pela mensagem, entendo que o atributo idPais é um objeto da classe Pais, não? Sendo assim, se você passar um Integer, terá esta exceção.
Como eu não acredito que você teria a capacidade de criar um atributo do tipo Pais com o nome idPais, na classe Estado, penso que você deveria fazer isso:
SELECT e FROM Estado e WHERE e.nomeEstado LIKE :nomeEstado AND e.pais.idPais = :idPais ORDER BY e.nomeEstado
Obrigado pela dica, infelizmente sua sugestão não funcionou.
Mas encontrei! =)
Reparei que o NetBeans não gerou para mim a namedquery de findByIdPais, por um motivo simples, havia esquecido que o JPA (aqui pelo menos) puxa os dados de cima pra baixo, no meu caso eu queria de baixo pra cima… então coloquei um JOIN. Não sei se eh a melhor das alternativas, ainda to aprendendo, mas… a solução que encontrei foi trocar a namedQuery para:
@NamedQuery(name = "Estado.findLikeNomeEstadoAndIdPais", query = "SELECT e FROM Estado e JOIN Pais p WHERE e.nomeEstado LIKE :nomeEstado AND p.idPais = :idPais ORDER BY e.nomeEstado")
ps.: Só preciso dos dados do Estado, por isto select “e” apenas
Liguei as tabelas e realmente não existe o e.idPais, existe o p.idPais Neste caso sempre vai existe uma vinculação, por isso o JOIN resolve pra mim.
drsmachado acho que vc mesmo já respondeu outras duvidas minhas aqui. Acho que estávamos em um mal momento e nos desentendemos.
Um problema que não resolvemos irrita muito. hehe
Realmente o problema pareceu “simples” e… Espero que esta seja uma forma não errada de contornar o erro.
E desculpe a comunidade pelo tópico no lugar errado, se eu tivesse aberto no lugar certo talvez estaria com isto resolvido desde ontem a noite mesmo.
Solução encontrada, tópico marcado como resolvido!
O que o amigo disse funcionou melhor…
So que no meu código eu deveria chamar e.idPais.idPais
Infelizmente tive a capacidade de criar um atributo do tipo Pais chamado idPais. Eu criei nao… o NB gerou… pior ainda neh! kkk Eu deveria ter percebido. Vou corrigir o gerado e ficará certo da forma como ele disse.
@NamedQuery(name = "Estado.findLikeNomeEstadoAndIdPais", query = "SELECT e FROM Estado e WHERE e.nomeEstado LIKE :nomeEstado AND e.idPais.idPais = :idPais")
A forma dele eh melhor que meu JOIN. É recodificar a roda.
Você deveria escultar mais as pessoas, se o drsmachado está falando que você deve utilizar primeiro JDBC do que JPA concerteza ele tem experiencia nisso e está tentando lhe ajudar nao é uma forma de querer criticar e prejudicar seus estudos, pelo contrario ele está certíssimo pois mais na frente você pode ter muita dificuldade de aprendizagem na tecnologia pois não pegou a base, então você vai ter que voltar tudo de novo.
E não sei se você seguiu esses passos, mas antes de usar Java Web, tente aprender JSP + Servlet, depois estudar algum framework como JSF, JPA, Hibernate e outros.
Tenho certeza que vai facilitar demais seu aprendizado.