JPA findAll entre 2 tables

14 respostas
W

GUJ ppl,

Tou com uma dúvida em pesquisas de 2 tabelas.

Quero fazer uma listagem do conteúdo de uma tabela, que tem um campo FK, mas quero que esse FK seja preenchido com um campo de outra tabela.

ex:
Tabela Pessoa
idPessoa
nomePessoa

Tabela Cidade
idCidade
idPessoa(PK)
cidade

Quero q o conteúdo no TableData apareça:
idCidade | nomePessoa | cidade

[]'s

Wakky

14 Respostas

H

cara desculpa comentar mais

  1. Tabela Pessoa
  2. idPessoa
  3. nomePessoa
  4. Tabela Cidade
  5. idCidade
  6. idPessoa(PK)
  7. cidade

1 - acho que deveria ser o contrario. O id da cidade tem que ficar na pessoa.
2 - voce esta usando hibernate annotations?
se sim o proprio relacionamento one-to-many ja te da suporte a isso!

W

Oi cara tudo bem?

obrigado pela ajuda.

Como faço para usar o one-to-many?? Pode postar um exemplo???

Estou usando JPA

[]'s

Wakky

J

Use a annotation @OneToMany

Não tem segredo nenhum, coloque essa anotation sobre o objeto da classe, por exemplo

public class Pessoa {
  private Integer idPessoa;
  ...
  @OneToMany(cascade={CascadeType.ALL})
  private Cidade cidade;
  ..getters and setters
}

Assim, por padrão o JPA vai buscar um campo chamado “cidade_id” na tabela de Pessoa.

Se você quiser exemplos mais completos, tenta http://www.google.com.br/search?hl=pt-BR&q=OneToMany+JPA&btnG=Pesquisa+Google&meta=

Para fazer a consulta depois, é só trazer os objetos Pessoas e usar o getCidade() para retornar a cidade correspondente da pessoa. (Se a consulta estiver fora do contexto da transação, ai será necessário você usar o atributo fetch=FetchType.EAGER).

W

ManchesteR,

Obrigado, a minha duvida reside na pesquisa, pq eu tenho uma session (gerada automaticamente plo netbeans) que faz da a seguinte pesquisada:

public List<Pessoa> findAll() {
        return em.createQuery("select object(o) from Pessoa as o").getResultList();
    }

e o msmo para Cidade… nesse caso como seria a pesquisa?

O que existe:
Entity

@Entity
@Table(name = "Pessoa")
@NamedQueries({@NamedQuery(name = "Pessoa.findByIdPessoa", query = "SELECT p FROM Pessoa p WHERE p.idPessoa = :idPessoa"), 
@NamedQuery(name = "Pessoa.findByPessoa", query = "SELECT p FROM Pessoa p WHERE p.pessoa = :pessoa"), 
@NamedQuery(name = "Pessoa.findByIdCidadeFK", query = "SELECT p FROM Pessoa p WHERE p.idCidadeFK = :idCidadeFK")})
public class Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "idPessoa", nullable = false)
    private Integer idPessoa;
    @Column(name = "Pessoa")
    private String pessoa;
    @Column(name = "idCidade_FK", nullable = false)
    private int idCidadeFK;
    
/**
*ADICIONADO A MAO
*/
    @OneToMany(cascade={CascadeType.ALL}
    private Cidade cidade;

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this. cidade = cidade;
    }
/**
*FIM ADICIONADO A MAO
*/
    public Pessoa() {
    }

    public Pessoa(Integer idPessoa) {
        this.idPessoa = idPessoa;
    }

    public Pessoa(Integer idPessoa, int idCidadeFK) {
        this.idPessoa = idPessoa;
        this.idCidadeFK = idCidadeFK;
    }

    public Integer getIdPessoa() {
        return idPessoa;
    }

    public void setIdPessoa(Integer idPessoa) {
        this.idPessoa = idPessoa;
    }

    public String getPessoa() {
        return pessoa;
    }

    public void setPessoa(String pessoa) {
        this.pessoa = pessoa;
    }

    public int getIdCidadeFK() {
        return idCidadeFK;
    }

    public void setIdCidadeFK(int idCidadeFK) {
        this.idCidadeFK = idCidadeFK;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idPessoa != null ? idPessoa.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Pessoa)) {
            return false;
        }
        Pessoa other = (Pessoa) object;
        if ((this.idPessoa == null && other.idPessoa != null) || (this.idPessoa != null && !this.idPessoa.equals(other.idPessoa))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Pessoa[idPessoa=" + idPessoa + "]";
    }

}

…a Session:

@Stateless
public class PessoaFacade implements PessoaFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Pessoa pessoa) {
        em.persist(pessoa);
    }

    public void edit(Pessoa pessoa) {
        em.merge(pessoa);
    }

    public void remove(Pessoa pessoa) {
        em.remove(em.merge(pessoa));
    }

    public Pessoa find(Object id) {
        return em.find(entity.Pessoa.class, id);
    }

    public List<Pessoa> findAll() {
        return em.createQuery("select object(o) from Pessoa as o").getResultList();
    }

}

[]'s

Wakky

J

Primeiro de tudo,
Esquece esses Wizards (seja de Netbeans, Eclipse, Plugin e etc), entenda primeiro como a JPA funciona.

Segundo, esqueça esse idCidadeFK, você não precisa declarar ela… Quando você usa private Cidade cidade, ele já vai usar um campo chamado cidade_id dentro da tabela de Pessoa.

No caso do método criado pelo netbeans, você pode alterá-lo e inserior um JOIN FETCH ai, algo do tipo

return em.createQuery("select object(o) from Pessoa o JOIN FETCH o.cidade").getResultList();
W

Ya cara… eu sei… :frowning: tou me desligando desses wizards em tudo…

Vou testar agora.

E no caso de OneToOne é da mesma maneira?

[]'s

Wakky

J

Wakky:
Ya cara… eu sei… :frowning: tou me desligando desses wizards em tudo…

Vou testar agora.

E no caso de OneToOne é da mesma maneira?

[]'s

Wakky

Cara, o que eu falei era para o OneToOne, foi mal :wink:

O OneToMany dá para fazer de duas formas… unidirecional e bidirecional. O unidirecional você precisa de uma tabela auxiliar, enquanto o bidirecional não.
Para usar o Unidirecional você só usa o @OneToMany conforme dito, porém tem que criar uma tabela PESSOA_CIDADE. Agora se for utilizar bidreicional, você deve usar o mappedBy no @OneToMany e também usar o @ManyToOne na classe Cidade.

o @OneToOne é o mais simples, conforme eu já expliquei.

Parece confuso, mas não é não… tire um tempo para estudá-lo. Tem um PDF Free (Mastering Enterprise JavaBeans 3.0 4th Edition - procure no google que você acha para download). Ele tem uma sessão de JPA interessante.

Caso queria um livro, eu indico o Pro EJB 3 Java Persistence API.

W

:frowning: Cara
ta dando um exception:

Internal Exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column
J

Você estudou o OneToMany e ManyToOne? qual tecnica voc6e vai usar, unidirecional ou bidirecional?
Esse erro provavelmente é porque a JPA não achou a coluna com o nome que ela precisa.

Mostra suas classes e estruturas das suas tabelas.

W

eu botei ele para mostrar na consola e não estou intendendo o seguinte:

ele mostra os campos todos de pessoa mais este: t0.CIDADE_idCidade, e depois começa com os da Cidade.

Depois pega a exception:

Internal Exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 't0.CIDADE_idCidade' in 'field list'

W

se os campos tiverem nomes diferentes?? idCidade numa e idCidades na outra?? influencia?

J

Como eu disse meu amigo, a nomenclatura utilizada por você está diferente dos padrões que o JPA trabalha, ou alguma coluna/tabela está faltando.

E digo novamente, estude a parte de relacionamento e decida qual o melhor para você (unidirecional ou bidirecional), porque cada um usa estratégias diferentes.

W

vou voltar a dar uma vista entao…

valeu a ajuda :slight_smile:

[]'s

Wakky

V

ola Jair

veja se pode me ajudar

a query :

Select p from ManySideA p join fetch p.ManySideB

ok isso funciona
mas vai q eu tenho 100 000 ManySideB!!!

eu soh preciso dos ManySideB pra não haver L I EXCEptions…

estou numa many to many onde vou adicionando as collections das entities nas suas correspondentes

poderia me dizer como faço pra adicionar as collections qndo uso ManyToMany???

abraço

Criado 27 de julho de 2008
Ultima resposta 25 de set. de 2008
Respostas 14
Participantes 4