[RESOLVIDO]Select JPA com Filtro

Ola pessoal,

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.

A tabela referente é:

olha acho que isso não é java básico, desculpa aew n posso ajudar

To no java a 3 meses… por isso acho que eh básico… mas nao sei… se algum moderador puder mover o tópico…

3 meses no Java? E usando JPA e Annotations.

Sim… Muito mais fácil que trabalhar com SQL puro. :wink:

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.

Obrigado comunidade.

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

Arrogante? ok.

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

Percebeu a malandragem ali?

Ah, ia esquecendo, o problema não é no AND é no parâmetro incorreto que você está utilizando. Se trocá-lo por OR será a mesma coisa.
Além disso:

Assim você nunca mais esquece.

é…

Porque não usei o Join???

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. :slight_smile: 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!

FONTE: http://www.objectdb.com/java/jpa/query/jpql/from#INNER_JOIN_

Última coisa, se alguem puder mover o tópico pra lugar correto como apontado pelo drsmachado.

Correção!

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.

rcmatias

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.

Valeu, Sucesso!