@ManyToMany - Listar pessoas que tem um endereço [RESOLVIDO]

4 respostas
jrfercar

Bom dia,

Peço ajuda para a realização de uma consulta em classes com relacionamento @ManyToMany.

O problema é o seguinte.

Tenho uma classe chamada AbstractPessoa e outra chamada Endereco. A classe AbstractPessoa pode ter vários endereços e um Endereço pode ser de várias pessoas.
Como posso obter todas as pessoas que moram em um endereço e que comecem com o nome por exemplo “José”.

@Entity
@Table(name = "pessoas")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractPessoa implements Serializable {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(name = "id", unique = true, nullable = false, length = 32)
    private String id;
    @Column(nullable = false)
    private String nome;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = false)
    private Date dataDeNascimento;
    @Column(nullable = true)
    private String observacao;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "senha", referencedColumnName = "id")
    private Senha senha;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "enderecosdepessoas", joinColumns =
    @JoinColumn(name = "pessoa"), inverseJoinColumns =
    @JoinColumn(name = "endereco"))
    private Set<Endereco> enderecos;
}
@Entity
@Table(name = "enderecos")
public class Endereco extends Entidade {
    private String logradouro;
    private String cidade;
    private String estado;
    @Column(nullable = true)
    private String numero;
    @Column(nullable = true)
    private String complemento;
    @ManyToMany(targetEntity = AbstractPessoa.class, mappedBy = "enderecos", fetch = FetchType.LAZY)
    private List<AbstractPessoa> pessoas;

Agradeço qualquer ajuda.

4 Respostas

luxu

pesquise sobre Criteria, se seu relacionamento estiver correto vai ser mole-mole…veja um exemplo:

Listar todos os funcionários que tenham na DESCRIÇÃO o conteúdo rofes

public List<Funcionario> getProfFunc(){ Criteria cargos = session.createCriteria(Cargo.class); cargos.add(Restrictions.ilike("descricao", "%rofes%")); List<Cargo> cargo = cargos.list(); Criteria crit = session.createCriteria(Funcionario.class); crit.add(Restrictions.eq("cargo.codigo",cargo.get(0).getCodigo())); return crit.list(); }

A

segue um exemplo com hql

select e from AbstractPessoa p left join fetch p.enderecos e

t+

maior_abandonado

jrfercar:
Bom dia,

Peço ajuda para a realização de uma consulta em classes com relacionamento @ManyToMany.

O problema é o seguinte.

Tenho uma classe chamada AbstractPessoa e outra chamada Endereco. A classe AbstractPessoa pode ter vários endereços e um Endereço pode ser de várias pessoas.
Como posso obter todas as pessoas que moram em um endereço e que comecem com o nome por exemplo “José”.

@Entity
@Table(name = "pessoas")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractPessoa implements Serializable {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(name = "id", unique = true, nullable = false, length = 32)
    private String id;
    @Column(nullable = false)
    private String nome;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = false)
    private Date dataDeNascimento;
    @Column(nullable = true)
    private String observacao;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "senha", referencedColumnName = "id")
    private Senha senha;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "enderecosdepessoas", joinColumns =
    @JoinColumn(name = "pessoa"), inverseJoinColumns =
    @JoinColumn(name = "endereco"))
    private Set&lt;Endereco&gt; enderecos;
}
@Entity
@Table(name = "enderecos")
public class Endereco extends Entidade {
    private String logradouro;
    private String cidade;
    private String estado;
    @Column(nullable = true)
    private String numero;
    @Column(nullable = true)
    private String complemento;
    @ManyToMany(targetEntity = AbstractPessoa.class, mappedBy = "enderecos", fetch = FetchType.LAZY)
    private List&lt;AbstractPessoa&gt; pessoas;

Agradeço qualquer ajuda.

select p from AbstractPessoa p inner join p.enderecos e where e.id = :seuId and p.nome like :nomePessoa

Apenas considerando que seu bean do endereço está errado, não tem um id.

jrfercar

Obrigado a todos que me ajudaram.

Sobre a classe endereço, ela herda as características de uma classe abstrata chamada Entidade. É nesta classe abstrata que encontra-se o ID e o Gerador de ID.

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Entidade implements Serializable {

    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid")
    @Column(name="id", unique=true, nullable=false, length=32)
    private String id;

Resolvi o problema da seguinte forma:

SELECT a FROM PessoaFisica a LEFT JOIN FETCH a.enderecos n WHERE a.id &lt;&gt; '" + pessoa.getId() + "' AND EXISTS(SELECT v FROM Endereco v WHERE n.nome = '" + cidade.getNome()  + "') AND a.nome like '" + strNome + "%'";

Durante a solução deste problema, com o apoio dos colegas de forum, descobri que não se pode dar o nome do objeto de end, pois esta parece ser uma palavra reservada do JPA. Neste sentido, foi só trocar o end por v que tudo começou a funcionar.

Mais uma vez, muito obrigado a todos.

Criado 26 de setembro de 2011
Ultima resposta 27 de set. de 2011
Respostas 4
Participantes 4