[RESOLVIDO]HQL/Query.getResultList() registros repetidos

4 respostas
A

Boa Tarde!

Estou com um problema minha HQL esta retornando valores repetidos eu tenho duas entidades Pessoa e PessoaTelefone, se na PessoaTelefone tem 2 registros o HQL retorna 2 registros repetidos e assim por diante

Models

public class Pessoa implements java.io.Serializable {
    private int codigo;
    private String nome;
    private List<Pessoatelefone> pessoatelefones = new ArrayList<Pessoatelefone>();

    ....
    ....

    @OneToMany(mappedBy = "pessoa", fetch = FetchType.EAGER, targetEntity = Pessoatelefone.class,
               cascade=CascadeType.ALL, orphanRemoval = true)
    //@Fetch(FetchMode.JOIN)
    public List<Pessoatelefone> getPessoatelefones() {
        return pessoatelefones;
    }

}


public class Pessoatelefone implements java.io.Serializable {

    private int codigopessoatelefone;
    private Pessoa pessoa;
    private String numerotelefone;
   
    ....
    ....

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "CODIGOPESSOA", nullable=false)
    public Pessoa getPessoa() {
        return this.pessoa;
    }   

}

Trecho que consulta

public List<Pessoa> consultarPessoaHQL(Pessoa p_Pessoa) throws Exception {

        EntityManagerFactory emf = null;
        EntityManager em = null;
        try {
            emf = Persistence.createEntityManagerFactory("teste");
            em = emf.createEntityManager();

            Query q = em.createQuery("FROM Pessoa p JOIN FETCH p.pessoatelefones WHERE p.codigo = ?1");
            
            q.setParameter(1, p_Pessoa.getCodigo());

            return (List<Pessoa>) q.getResultList();

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (em != null) {
                em.close();
            }
            if (emf != null) {
                emf.close();
            }
            EntityManagerFactoryImpl empImpl = (EntityManagerFactoryImpl) emf;
            System.out.println(empImpl.getSessionFactory().getStatistics());
        }

    }

Fiz um for com a Lista de Pessoa

Codigo: 4

Nome: Pessoa4

Sexo: M

Data Nascimento: null


Telefones:

Codigo Telefone: 7
Número Telefone: 33333333


Codigo Telefone: 8
Número Telefone: 44444444


------------------------------------------------


Codigo: 4

Nome: Pessoa4

Sexo: M

Data Nascimento: null


Telefones:

Codigo Telefone: 7
Número Telefone: 33333333


Codigo Telefone: 8
Número Telefone: 44444444


------------------------------------------------

4 Respostas

paulo1911

Olá amgarcia,

Acredito que seja pelo fato de vc estar dando um Join Fetch em pessoa telefone, onde o correto na minha opiniao seria vc dar select em pessoatelefone fazendo um join em pessoa, telefones são 2 e pessoas sao 1 sendo assim dependendo do seu mapeamento vc trazendo 1 pessoa vc traz 2x os telefones…

tente dar um select em pessoa telefone fazendo um join em pessoa…

Fallow

marcos1EM

amgarcia , como você está fazendo um join, lógicamente irá trazer dois registros quando a pessoa tiver dois telefones. Porém pelo que entendi, no seu caso não há necessidade de fazer um join com PessoasTelefones, basta simplesmente buscar a Pessoa que automaticamente você poderá obter as PessoasTelefones através do método getPessoatelefones quando quiser.

Então acho que basta fazer isso:

A

mas a sua query precisa trazer o q? Se for uma lista de pessoas, pq não usar apenas

por quê vc está fazendo o “join” sendo que não faz nenhum referência a “pessoatelefones”, faria sentido se fosse fazer referência há algum atributo da lista ou pq quer que pessoa venha com “pessoatelefones” preenchidos, mudando o comportamento do Lazy.

A

Valeu Pessoal era isso mesmo!

Criado 3 de janeiro de 2011
Ultima resposta 3 de jan. de 2011
Respostas 4
Participantes 4