Instanceof (JPA)

10 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?

10 Respostas

acopiara

Explica melhor qual é a tua necessidade!

pablofaria

Eu preciso saber se um objeto é filho de outro.

Tenho uma classe Pessoa e uma Usuario que herda de Pessoa.
Surgiu a nescessidade de em uma query recuperar todas as Pessoas que forem Usuarias

acopiara

E no seu mapeamento da herança, você não colocou um DiscriminatorValue na subclasse?

pablofaria

sim coloquei

Mais como faço para fazer essa verificação?

ele não deixa isso:

e nem assim

to usando Hibernate + JPA

acopiara

Você já tentou fazer assim ?

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?????

acopiara
Concordo sim, mas cara tenho tres classes mapeadas da seguinte forma e funciona beleza;
@Entity
@Table(name = "PROJETO")
@SequenceGenerator(name = "SE_PROJETO", sequenceName = "SE_PROJETO")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TIPO_PLC", discriminatorType = DiscriminatorType.STRING, length = 2)
public class Projeto{

@Id
private Long id;

//mais atributos
}

@Entity
@DiscriminatorValue("EC")
public class ProjetoExtraConvenio extends Projeto {
//mais atributos
}


@Entity
@DiscriminatorValue("CV")
public class ProjetoConvenio extends Projeto {
//mais atributos
}


//Minha consulta  dessa forma
select pv.identificacao from  ProjetoExtraConvenio pv 

//select gerado
select
  projetoext0_.IDENTIFICACAO as col_0_0_ 
 from
  PROJETO projetoext0_ 
 where
  projetoext0_.TIPO_PLC='EC'

Acho que era pra funcionar numa boa!!

Valeu

pablofaria

cara funciona sim…

Mais eu quero fazer um instanceof em uma query, eu “preciso”. To perguntando se dá pra fazer…

Se não sabe também deixa alguém que saiba responder…

acopiara

Se não precisa, consequentemente não tem. E com certeza não irei responder mais nenhuma dúvida sua!

pablofaria

Alguem???

Criado 15 de dezembro de 2007
Ultima resposta 17 de dez. de 2007
Respostas 10
Participantes 2