Query numa associação polifórmica

7 respostas
rafaelsantini

Estou tentando executar uma query numa associação polifórmica:

from Pessoa where nome = 'Rafael';

Mas o seguinte erro está sendo retornado: Unknown column 'pessoa1_2_.nome' in 'where clause'.

O mapeamento é:

<class name="Pessoa" table="bs_com_pessoa">

  <id name="id" type="java.lang.Long">
    <generator class="native"/>     
  </id>

  <joined-subclass name="PessoaFisica" table="bs_com_pessoa_fisica">
    <key column="id_pessoa"/>
    <property column="nome" name="nome" not-null="true"/>
  </joined-subclass>

  <joined-subclass name="PessoaJuridica" table="bs_com_pessoa_juridica">
    <key column="id_pessoa"/>
    <property name="razaoSocial" column="razao_social" not-null="true"/>
    <property name="nomeFantasia" column="nome_fantasia" not-null="true"/>     
  </joined-subclass>

</class>

<class name="Cliente" table="bs_erp_cliente">

  <id name="id" type="java.lang.Integer">   
    <generator class="native"/>     
  </id>

  <many-to-one name="pessoa" class="Pessoa" column="id_pessoa" not-null="true" unique="true" cascade="all"/>

</class>

O Hibernate suporta esse tipo de query?

7 Respostas

Lavieri

se pessoa não tem o campo ele não aceita … o correto seria

from PessoaFisica where nome = ‘Rafael’;

e com relação a modelagem, tanto pessoas, como empresas tem nomes, então poderia ser um campo comun as 2

rafaelsantini

A associação é polifórmica.

Lavieri

rafaelsantini:
A associação é polifórmica.

isso não justifica vc querer filtrar por um campo que não existe nas duas tabelas…

se Pessoa não tem a propriedade “nome” então vc não pode filtrar pessoas por nome… é preciso filtrar algo que tenha essa propriedade, no caso pessoaJuridica…

para filtrar polimorficamente, a propriedade nome, deveria estar em pessoa, e servir tanto a empresa como a pessoas fisicas

rafaelsantini
Pessoa {}

PessoaFisica extends Pessoa {
    nome;
}

PessoaJuridica extends Pessoa {
    razaoSocial;
    nomeFantasia;
}

Cliente {
    Pessoa pessoa;
}

Se quero buscar os clientes pelo nome, então pela hierarquia dessas classes sabe-se que a consulta deve ser realizada sobre PessoaFisica. O meu problema é que o Hibernate não está conseguindo executar essa query polifórmica. De duas uma: ou estou esquecendo de algo no mapeamento ou o Hibernate está com algum bug.

Lavieri

o mapeamento não esta com bug, vc que esta querendo enxergar o impossivel ^ ^

tenta fazer…

Pessoa pessoa;

pessoa.getNome(); //<== vai dar erro

assim como não é possivel em java, não é possivel em HQL …

se vc quer fazer a query tem que fazer em PessoaFisica que é a dona da propriedade…

o polimorfismo compartilha as propriedades abrangentes, ou seja todos os atributos de Pessoa, mas nenhum propriedade especifica, ou seja, nada de pessoafisica ou pessoajuridica será visto em pessoa

Lavieri

um exemplo de mapeamento polimorfico, onde há compartilhamento de propriedades

@Entity @DiscriminatorColumn(name="tipo",discriminatorType=DiscriminatorType.CHAR,length=1) @Inheritance(strategy = JOINED) public abstract class Parceiro implements Serializable { private static final long serialVersionUID = -8318906425730027215L; private Integer id; //todo objeto tem id private String nome; //toda empresa ou pessoa tem um nome private String nomeExibicao; //pessoas tem nome de exibição, empresas nome fantasia private String documentoId; //pessoas cpf, empresas cgc private Date nascimento; //pessoas data nascimento, empresas de fundação //... }

os campos são os mesmos, servem a um proposito comum, por isso ficam em Parceiro que é supercalsse de Pessoa e de Empresa

rafaelsantini

A query polifórmica funciona (não é necessário ter as propriedades compartilhadas). Se a consulta for from Pessoa where nome = ‘Rafael’, ele irá retornar os objetos do tipo PessoaFisica cujo nome é igual a Rafael. Porém, se a consulta for numa associação polifórmica (from Cliente where pessoa.nome = ‘Rafael’), ocorre o erro. O problema, então, parece ser somente quando a query é numa associação polifórmica (from Cliente where pessoa). Caso o Hibernate não consiga resolver uma query em uma associação polifórmica, posso contornar com um join entre Cliente e PessoaFisica ou PessoaJuridica (dependendo da propriedade).

Criado 19 de outubro de 2009
Ultima resposta 20 de out. de 2009
Respostas 7
Participantes 2