Dúvida com JPQL, uso de Collection com IN

6 respostas
augustocolom

Olá pessoal,

Estou tentando montar a seguinte query:

List pessoas = new ArrayList();
		pessoas.add("Romario");
		pessoas.add("Micalateia");
		pessoas.add("Radio");
		
		List<PessoaFisica> pessoas03 = em.createQuery("select p from PessoaFisica p where p.nome in (:lista)")
		.setParameter("lista", pessoas).getResultList();

Ao meu ver essa seria a forma de fazer isso, certo? Mas isso me traz a seguinte mensagem:

EL Info]: 2010-11-23 22:09:08.481--ServerSession(23047631)--Thread(Thread[main,5,main])--file:/mnt/dadoswindows/estudo/utfpr/06-PersistenciaOO/Aula-04-20101119/workspace/JPQL-04/bin/_posBanco login successful
Exception in thread "main" java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.ArrayList for parameter lista with expected type of class java.lang.String from query string select p from PessoaFisica p where p.nome in (:lista).

Sei que a mensagem diz que os parâmetros estão errados, mas minha coleção tem Strings e minha table tem textos, se faço direto:

select p from PessoaFisica p where p.nome in ('Micalateia', 'Romario')

Funciona, alguém tem uma sugestão?

6 Respostas

marcos1EM

Para passar uma lista como parâmetro utilize o setParameterList ao invés de setParameter

marcos1EM

Correção… setParameterList não é do JPA e sim do Hibernate, eu sempre confundo… rsrs

neno

Faltou vc "tipar" a lista...

List<String> pessoas = new ArrayList<String>();  
 pessoas.add("Romario");  
 pessoas.add("Micalateia");  
 pessoas.add("Radio");  
   
List<PessoaFisica> pessoas03 = em.createQuery("select p from PessoaFisica p where p.nome in (:lista)").setParameter("lista", pessoas).getResultList();

Vê se funfa..

augustocolom
neno:
Faltou vc "tipar" a lista...
List<String> pessoas = new ArrayList<String>();  
 pessoas.add("Romario");  
 pessoas.add("Micalateia");  
 pessoas.add("Radio");  
   
List<PessoaFisica> pessoas03 = em.createQuery("select p from PessoaFisica p where p.nome in (:lista)").setParameter("lista", pessoas).getResultList();

Vê se funfa..

Ja tentei deixa-la como String, da o mesmo erro.
Será possível fazer isso sem usar o Hibernate?

mRc

Estou com esse mesmo problema, alguem já achou a solução?

List<String> pessoas = new ArrayList<String>();    
pessoas.add("Romario");    
pessoas.add("Micalateia");    
pessoas.add("Radio");    
     
List<PessoaFisica> pessoas03 = em.createQuery("select p from PessoaFisica p where p.nome in (:lista)").setParameter("lista", pessoas).getResultList();
douglasjunior

Sei que o tópico é antigo, mas como ninguém deu a resposta resolvi postar.

Para funcionar no JPA 2.0 basta retirar os parênteses do (:lista), ficando assim:

List<String> pessoas = new ArrayList<String>();
		pessoas.add("Romario");
		pessoas.add("Micalateia");
		pessoas.add("Radio");
		
		List<PessoaFisica> pessoas03 = em.createQuery("select p from PessoaFisica p where p.nome in :lista")
		.setParameter("lista", pessoas).getResultList();

Abraços
Douglas Junior

Criado 23 de novembro de 2010
Ultima resposta 16 de mar. de 2013
Respostas 6
Participantes 5