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
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).