Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida JPQL de Associativa

Estou com a seguinte duvida, como poderia fazer um JPQL para trazer informações de uma tabela associativa ?

No SQL ela fica dessa forma:

select * from pessoa_time where id_Pessoa = 1;

Ela me traz todos os dados de pessoa_time que tem id_pessoa igual a 1. Desejo fazer essa consulta em JPQL, vou explicar o porque:

O sistema possui cadastro de Pessoas, e pessoas podem Cadastrar Times. A ideia e listar todos os Times de uma certa pessoa.

Vamos as classes:

Pessoa:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column (name="id_Pessoa")
    private Integer id;

    @Column()
    private String nomeUsuario;

    @Column()
    private String senhaUsuario;

    @Column()
    private String nomeCompleto;

    @Column()
    private String email;

    @Column()
    private Integer idade;

    /*@ManyToMany
     @JoinTable(name="Pessoa_Time",joinColumns={@JoinColumn(name="id_pessoa")}, 
     inverseJoinColumns={@JoinColumn(name="id_time")})*/
    @ManyToMany(mappedBy="listaPessoas")
    private List<Time> listaTimes;

Time:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column (name="id_Time")
    private int id;

    @Column(nullable=false)
    private String nome;

    @Column(nullable=false)
    private String senhaTime;

    /*@ManyToMany(mappedBy="listaTimes")*/
    @ManyToMany
     @JoinTable(name="Pessoa_Time",joinColumns={@JoinColumn(name="id_time")}, 
     inverseJoinColumns={@JoinColumn(name="id_pessoa")})
    private List<Pessoa> listaPessoas;

O meu metodo atual esta da seguinte forma:

public List<Time> listarmeustimes(Pessoa pessoa) {

        Pessoa resultado = new Pessoa();

        String consulta = "select t from Time t join t.pessoas p where p.id = :id";
        Query query = getEm().createQuery(consulta);

        query.setParameter("id", pessoa.getId());

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

        }
        return meustimes;
    }

Esse esta um pouco mais complexo porque eu pego o ID da pessoa que ja esta logado no sistema. Mas acredito que com essas informações voces ja conseguiram entender o meu problema.

1 resposta
solução!

Oi Rafael, via JPQL vc não consegue fazer a query apenas na tabela associativa, já que não existe nenhuma classe mapeando ela no sistema. Para vc fazer isso, precisaria criar uma classe nova que representasse essa relação, la vai o exemplo:

public class PessoaTime {

 @Id @GeneratedValue
 private Integer id;
  @ManyToOne
   private Pessoa pessoa;
   @ManyToOne
   private Time time;
}

Aí, na hora de inserir, você salvar um objeto do tipo PessoaTime.