HQL: Filtrar por atributo de uma subclass (Polimorphic query)

2 respostas
J

Tenho a seguinte estrutura:

class abstract Pessoa {
   private Integer id;
   private String nome;
   .....
}

class PessoaJuridica extends Pessoa {
   ....
}

class Empregado extends Pessoa {
   private float salario;
   .....

}

class FolhaPagamento {

   private Pessoa credor;
   ...

}

Preciso acessar a folha de pagamento onde o credor tenha um salario acima de R$ 1000,00. O problema é que o credor é uma Pessoa e não um Empregado. Como resolver isso?

HQL:

from FolhaPagamento as fp inner join fetch ((Empregado) fp.pessoa).salario > 1000

A sintaxe acima é inválida. Como eu faço para filtrar pelo atributo da subclasse Empregado ?

Alguém pode me ajudar? :?:

Obrigado!

2 Respostas

ddduran

Você ja tentou executar normalmente sem o cast?
algo assim:

from FolhaPagamento as fp where fp.credor.salario>1000

Por que segundo a doc o hibernate traz todas as instancias das subclasses junto com a consulta
http://www.hibernate.org/hib_docs/reference/en/html_single/#queryhql

Mas eu não testei, agora o que você pode fazer em caso de desespero é uma subquery
algo como isso

from FolhaPagamento as fp WHERE fp.credor IN (from Empregado em WHERE em.salario>1000)

Espero que ajude, ou que alguem tenha soluções mais elegantes.
Se conseguir, manda a resposta :wink:

J
from FolhaPagamento as fp where fp.credor.salario>1000

Se eu fizer como esta acima, o hibernate reclama pois não existe o salario na entidade pessoa.

Como eu preciso fazer isso rápido, vou fazer conforme sua sugestão, com subqueries.

Se alguém souber como fazer, por favor compartilhe com a comunidade.

Obrigado!

Criado 29 de agosto de 2008
Ultima resposta 29 de ago. de 2008
Respostas 2
Participantes 2