Ajuda com Query Hibernate

13 respostas
J

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

13 Respostas

Rodrigo_Sasaki

Você quer um HQL pra essa query?

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

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

Rodrigo_Sasaki

Sim, você pode usar o distinct pra isso.

J

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

Rodrigo_Sasaki

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

J

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

J

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

lucciano01

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

J

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

lucciano01

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 ";

J

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

lucciano01

o banco está preenchido?

J

pessoa

1;“TESTE PESSOA FISICA";“F”;"[email removido]”;"";“S”;“S”;“S”;“S"
2;“TESTE PESSOA JURIDICA";“J”;"[email removido]”;”";“S”;“S”;“S”;“S"
6;“vanderson”;“F”;"[email removido]”;"";“S”;“S”;“S”;“S"
11;“john vanderson";“F”;"[email removido]”;”";“S”;“S”;“S”;“S"
8;“TESTE PESSOA FISICA";“F”;"[email removido]”;”";“S”;“S”;“S”;“S"
9;“TESTE PESSOA FISICA";“F”;"[email removido]”;”";“S”;“S”;“S”;“S"
10;“TESTE PESSOA FISICA";“F”;"[email removido]”;”";“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;"[telefone removido]"
6;8;1;"[telefone removido]"
7;9;1;"[telefone removido]"
9;11;4;"[telefone removido]"
8;10;1;"[telefone removido]"
11;13;1;"[telefone removido]"
13;16;1;"[telefone removido]"
14;17;1;"[telefone removido]"
15;19;1;"[telefone removido]"
16;20;1;"[telefone removido]"
17;21;1;"[telefone removido]"
18;22;1;"[telefone removido]"
10;12;1;"[telefone removido]"
12;14;1;"[telefone removido]"
1;1;1;“[telefone removido]”

endereco

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

Criado 8 de janeiro de 2016
Ultima resposta 10 de jan. de 2016
Respostas 13
Participantes 3