Instanceof (JPA)

7 respostas
pablofaria

Como faço para fazer um instanceof em uma query no JPA:

Ex.:

Query query = em.createQuery("from com.teste.Pessoa p where p instanceof  com.teste.Usuario");

Tem como fazer algo do tipo?

7 Respostas

acdesouza
Query query = em.createQuery("from com.teste.Usuario u");

Desde que: Usuario implements/extends Pessoa.

pablofaria

cara é um pouco mais complicado:

na verdade tenho uma classe Usuario que tem um atributo do tipo Pessoa, e essa Pessoa pode ser, Funcionario, Gerente ou Administrador, ambos filhos de Pessoa.

Tenho que criar uma query que me retorne todos os usuários que as pessoas são Gerentes (isso é um exemplo)

Query query = em.createQuery("from Usuario u where u.pessoa instanceof  Gerente");

Sim tem como eu retornar todos e depois comparar, só que quando eu tiver 500 mil usuários, e apenas 50 gerentes vai ficar meio "pesado", não concorda?

Poderia fazer assim

ArrayList<Usuario> usuarios = new ArrayList<Usuarios>();

Query query = em.createQuery("from Usuario");
List<Usuario> aux = (List<Usuario>) query.getResultList();   

for(Usuario u : aux){
     if(u.getPessoa() instanceof Gerente)
            usuarios.add(u);
}

Só que fica meio "Bacalhau". Não concorda?????

jgbt

pq vc não faz uma consulta com join:

where usuario.pessoa.id = gerente.id

[]´s

pablofaria

Assim realmente funciona…

Achei que JPA teria alguma maneira de fazer um instanceof sem join, ou pelo menos sem que precisassemos escrever um.

Mais valeu. tá resolvido…

jgbt

na verdade não sei se tem, nunca procurei, mas acredito que não tenha.

[]´s

acdesouza
Query query = em.createQuery("from Usuario u where u.pessoa in ( select g from Gerente g )");

Também deve resolver. Dá uma olhada em qual possui melhor desempenho.

jgbt

acdesouza:
Query query = em.createQuery("from Usuario u where u.pessoa in ( select g from Gerente g )");

Também deve resolver. Dá uma olhada em qual possui melhor desempenho.


ate onde eu sei o IN vai ser mais lento, pq vai ser feito muito mais acessos ao BD, mas dependende muito de como esta o BD.

[]´s

Criado 18 de dezembro de 2007
Ultima resposta 19 de dez. de 2007
Respostas 7
Participantes 3