Pessoal, estou começando a utilizar o @ManyToMany. Tenho duas classes, Pessoa e Telefone, a tabela “Pessoas_Telefones” já foi criada e já está populada com os Ids de pessoa e telefone. Gostaria de exibir todos os dados de Pessoa e Telefone referente a cada ID através de uma consulta JPQL.
Código SQL ficaria assim:
SELECT * FROM pessoa p INNER JOIN pessoas_telefones pt ON p.id_pessoa=pt.pessoa_id
INNER JOIN telefone t ON t.id_telefone=pt.telefone_id;
Mas não estou conseguindo fazer essa pesquisa em JPQL devido a tabela “pessoas_telefone” e sobre o modo de formatação do INNER JOIN em JPQL.
Basta carregar uma lista de pessoas e a partir de uma instância de pessoa acessar o getListaFones() que será carregado.
Ex:
List<Pessoa>listPessoa=newArrayList<>();// carregar a lista de pessoasfor(Pessoapessoa:listPessoa){System.out.println('Nome:'+pessoa.nome);System.out.println('Telefones:');// aqui o JPA/Hibernate entrará em ação executando a query para pegar os telefones// baseado na tabela Pessoas_Telefonesfor(Telefonetelefone:pessoa.listaFones()){System.out.println(telefone.getNumero());}}
B
Bruno_23
Meu interesse seria fazer em JPQL, pois estou fazendo uma aplicação Web.
Como ficaria em JPQL, sabe me informar?
Vlw.
V
Vinicius.Rocha
Como foi falado, só de de executar:
selectpfromPessoap
você já consegue acessar através do getListaFones() mas, isso gerá a cada getListaFones() + 1 consulta. esse comportamento é chamado de LAZY
caso queira e tenha a certeza que sempre usará os dados do fone junto com a pessoa pode buscar dessa forma:
SelectpfromPessoapjoinfetchp.telefone.
a JPQL considera o nome da classe e o nome dos atributos. join fetch muda o comportamento para EAGER.
Aconselho a testar das duas formas e verificar no console as consultas geradas.
B
Bruno_23
Select p from Pessoa p join fetch p.telefone.
Não entendi p.telefone, num seria p.listaFones? Como ficaria em JPQL para me retornar o resultado dos dados completos da pessoa e telefone através do id da Pessoa? Ex: A pessoa tem 3 telefones cadastrados.