Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Listar dados de uma tabela associativa

Olá pessoa, estou com a seguinte duvida.

Meu exercício possui duas entidades que se relaciona: Pessoa e Time Onde Pessoa podem criar Times, criando assim a tabela associativa Pessoa_Time(id_pessoa e id_time).

Meu objetivo e realizar um método que liste todos os Times criados pela Pessoa que esta logada no sistema.

Minha duvida que surgiu foi o seguinte, eu teria que fazer uma DAO pra listar os atributos de Pessoa_Time ?

10 respostas

Seguinte erro:

HTTP Status 500 - org.hibernate.hql.ast.QuerySyntaxException: pessoa_time is not mapped [select t from pessoa_time u where u.id_pessoa = :pPessoa]

  • Pessoa DAO

public List listarmeustimes(Pessoa pessoa) {

Pessoa resultado = new Pessoa();

String consulta = "select t from pessoa_time u where u.id_pessoa = :pPessoa"; Query query = getEm().createQuery(consulta);

query.setParameter("pPessoa", pessoa.getNomeUsuario());

List meustimes = query.getResultList(); for (Time time : meustimes) { System.out.println(time.getNome());

} return meustimes; }

  • PessoaBean

public void listarmeustimes(){ getDao().listarmeustimes(getPessoa()); }

  • Pessoa MOdel

@ManyToMany(mappedBy="listaPessoas") private List listaTimes;

  • Time Model:

@ManyToMany @JoinTable(name="Pessoa_Time",joinColumns={@JoinColumn(name="id_time")}, inverseJoinColumns={@JoinColumn(name="id_pessoa")}) private List listaPessoas;

Oi Rafael, você realmente precisa de uma tabela associativa, mas como vc quer uma informação a mais, no caso se ele é o criador do time, você vai precisar adicionar mais uma coluna nela.

Pensando no seu código, você pode criar uma classe assim:

 public class Membro { 
  @ManyToOne
   private Time time;
  @ManyToOne
   private Pessoa pessoa;
   private boolean criador;


  ...
 }

E aí você consegue fazer a query baseada na classe Membro :).

Eu ria usar a propria tabela associativa para definir quem e o criador. Pessoa_Time:

  • Id_pessoa: quem criou o time
  • id_time: O ID do Time criado

Minha consulta seria algo como "Listar todos os times da Pessoa_Time onde id_time seria igual ao id da pessoa logada.

Oi Rafael, estamos nos perdendo aqui no contexto.. Eu to sempre puxando para as classes e você para as tabelas. Caso você esteja usando Hibernate ou qualquer outra implementação da JPA seria legal você ir pelo caminho de usar as classes como base das queries.

Caso você vá de JDBC puro, manda o sql direto, como vc já falou, que vai dar certo :).

Sim, eu uso Hibernate. Então trabalhando apenas com classes:

Como eu faria o select(JPQL) de uma classe que não existe ? Que seria a pessoa_time.

Porque so existe a classe Pessoa e Time, não existe a Pessoa_Time criada.

Meu método atualmente esta assim:

public List listarmeustimes(Pessoa pessoa) {

Pessoa resultado = new Pessoa();

String consulta = "select t from pessoa_time u where u.id_pessoa = :pPessoa"; Query query = getEm().createQuery(consulta); query.setParameter("pPessoa", pessoa.getNomeUsuario());

List meustimes = query.getResultList(); for (Time time : meustimes) { System.out.println(time.getNome());

} return meustimes; }

solução!

Opa, poderia ser assim:

select t from Time t join t.pessoas p where p.id = :id

Isso vai retornar todos os times que tem a pessoa com determinado id.

Alberto, poderia me mostrar como ela seria um um SQL normal ? Quero tirar uma duvida que tenho com JPQL

select * from Time t inner join Time_Pessoa tp on t.id = tp.time_id inner join Pessoa p on p.id = tp.pessoa_id where p.id = idQueVcQuer

Ele informou o seguinte erro Alberto:

10:54:38    select * from Time t inner join Time_Pessoa tp on t.id = tp.time_id inner join Pessoa p on p.id = tp.pessoa_id where p.id = 1 LIMIT 0, 1000    Error Code: 1146. Table 'arena.time_pessoa' doesn't exist    0.000 sec

Eu consigo fazer alto parecido assim:

select * from pessoa_time where id_Pessoa = 1;

Oi Rafael, é que eu não me preocupei com os nomes das tabelas. Pode ver que falei Time_Pessoa, só que pela sua query é pessoa_time.. Da uma olhada nisso.