Ajuda com Query Hibernate

Galera queria uma ajuda com uma query onde as Tabela envovidas seriam:

Pessoa
Contatos
Endereco
Telefone
PessoaFisica
PessoaJuridica

a classe Pessoa iria ter:

id
nome
private PessoaFisica pessoaFisica;

@OneToOne(fetch = FetchType.EAGER, mappedBy = "pessoa", cascade = CascadeType.ALL)
private PessoaJuridica pessoaJuridica;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<PessoaEndereco> listaPessoaEndereco;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<PessoaContato> listaPessoaContato;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<PessoaTelefone> listaPessoaTelefone;

ex gostaria de uma lista das pessoas que moram em SP

Você quer um HQL pra essa query?

select p from Pessoa p inner join p.listaPessoaEndereco e where e.estado = :saoPaulo

eu tentei assim brother mais supondo quer uma pessoa tenha mais de um endereco na cidade ou estado o mesmo não iria retorna mais de um registro ?, pensei em usar o distinct

Sim, você pode usar o distinct pra isso.

campea testei aqui e não deu certo tipo posso cadastra a pessoa e não cadastrar o endereço dela ou seja posso ter o cadastro de uma pessoa chamada joao no qual não cadastrei o endereço mando pesquisar pelo nome e o mesmo não me retorna nada pois não tenho endereço com o id do registro do joão

Mas é exatamente isso que tem que acontecer. Se você quer buscar as pessoas que moram em SP, as pessoas sem endereço não podem aparecer no resultado, concorda?

Caso queira incluir pessoas sem endereço é necessário fazer um left join

isso mesmo realmente se eu quiser as pessoas que moram em sp realmente não deve aparecer nada mais se eu fazer a busca informando somente o nome ? nesse caso realmente cabe o lefth join

eu montei a query assim :

  sql = "SELECT DISTINCT p FROM Pessoa p "
                + "inner join p.pessoaFisica f "
                + "LEFT join p.listaPessoaEndereco e "
                + "LEFT join p.listaPessoaContato c "
                + "LEFT join p.listaPessoaTelefone t "
                + "where p.nome like ?1 and e.cidade like ?2 and e.uf like ?3 "
                + "and f.cpf like ?4";

mais não está trazendo todos os registro de pessoa fisica

o left só vai trazer o lado esquerdo da junção na consulta, deixa apenas o join para ver se dá certo

retirando o left a consulta vem vazia tanto com o hibernate tanto executando direto no postgres

sql = "SELECT DISTINCT p FROM Pessoa p "
+ "inner join p.pessoaFisica f ON f.cpf like ?4 "
+ "join p.listaPessoaEndereco e ON e.cidade like ?2 "
+ "join p.listaPessoaContato c "
+ "join p.listaPessoaTelefone t "
+ "where p.nome like ?1 and e.uf like ?3 ";

sql = "SELECT DISTINCT p FROM Pessoa p "

  • "inner join p.pessoaFisica f ON f.cpf like ?4 "
  • "join p.listaPessoaEndereco e ON e.cidade like ?2 "
  • "join p.listaPessoaContato c "
  • "join p.listaPessoaTelefone t "
  • "where p.nome like ?1 and e.uf like ?3 "

retorno uma lista vazia

o banco está preenchido?

pessoa

1;“TESTE PESSOA FISICA";“F”;"pf@gmail.com”;"";“S”;“S”;“S”;“S"
2;“TESTE PESSOA JURIDICA";“J”;"pj@gmail.com”;”";“S”;“S”;“S”;“S"
6;“vanderson”;“F”;"gelsonbarlez@gmail.com”;"";“S”;“S”;“S”;“S"
11;“john vanderson";“F”;"vanderson182@gmail.com”;”";“S”;“S”;“S”;“S"
8;“TESTE PESSOA FISICA";“F”;"pf@gmail.com”;”";“S”;“S”;“S”;“S"
9;“TESTE PESSOA FISICA";“F”;"pf@gmail.com”;”";“S”;“S”;“S”;“S"
10;“TESTE PESSOA FISICA";“F”;"pf@gmail.com”;”";“S”;“S”;“S”;“S"
12;“66666666666666”;“F”;”";"";“S”;“S”;“S”;“S"
13;“5156115615156”;“F”;”";"";“S”;“S”;“S”;“S"
14;“vcasdva”;“F”;”";"";“S”;“S”;“S”;“S"
15;“fdsfSDFsd”;“J”;”";"";“S”;“S”;“S”;“S"
16;“sdSD”;“F”;”";"";“S”;“S”;“S”;“S"
17;“xc\zxc\zxc\zxc\zx”;“F”;”";"";“S”;“S”;“S”;“S”

pessoa fisica

4;6;4;"02056446510"
6;8;1;"02056446510"
7;9;1;"02056446510"
9;11;4;"02056446510"
8;10;1;"02056446510"
11;13;1;"02056446510"
13;16;1;"02056446510"
14;17;1;"02056446510"
15;19;1;"02056446510"
16;20;1;"02056446510"
17;21;1;"02056446510"
18;22;1;"02056446510"
10;12;1;"02056446510"
12;14;1;"02056446510"
1;1;1;“46241474804”

endereco

1;1;“LOGRADOURO PESSOA FISICA”;“2”;“COMPLEMENTO”;“BAIRRO”;"CIDADE"
2;2;“LOGRADOURO PESSOA JURIDICA”;“3”;“COMPLEMENTO”;“BAIRRO”;“CIDADE”