[RESOLVIDO] Realizar uma consulta com Hibernate com Join

Estou em um projeto, que travei no ponto de retornar um lista usando a FK do relacionamento.
tenho os seguintes relacionamentos, como ficaria a JPQL para usar na query?

package br.com.grupoinvestiga.model;

import java.util.Calendar;
import java.util.Collection;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Atividades {
	
	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
	private long id;
	
	private String categoria;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Calendar data = Calendar.getInstance();
	
	private String titulo;
	
	@OneToMany(mappedBy = "atividades", targetEntity = Perguntas.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Perguntas> perguntas;
	
	public Calendar getData() {
		return data;
	}
	
	public Collection<Perguntas> getPerguntas() {
		return perguntas;
	}
	
	public void setPerguntas(List<Perguntas> perguntas) {
		this.perguntas = perguntas;
	}
	
	public long getId() {
		return id;
	}
	
	public void setId(long id) {
		this.id = id;
	}
	
	public String getCategoria() {
		return categoria;
	}
	
	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}
	
	public String getTitulo() {
		return titulo;
	}
	
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
}
package br.com.grupoinvestiga.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Perguntas {

	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
	private long id;
	
	@ManyToOne
	@JoinColumn(name="atividadesId")
	private Atividades atividades;
	
	private String pergunta;
	
	@OneToMany(mappedBy = "perguntas", targetEntity = Alternativas.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Alternativas> alternativas;
	
	public long getId() {
		return id;
	}
	
	public List<Alternativas> getAlternativas() {
		return alternativas;
	}
	
	public void setAlternativas(List<Alternativas> alternativas) {
		this.alternativas = alternativas;
	}
	
	public void setId(long id) {
		this.id = id;
	}
	
	public String getPergunta() {
		return pergunta;
	}
	
	public void setPergunta(String pergunta) {
		this.pergunta = pergunta;
	}
	
	public Atividades getAtividades() {
		return atividades;
	}
	
	public void setAtividades(Atividades atividades) {
		this.atividades = atividades;
	}
}

procurei exemplos na internet, pois quero retorna todas as perguntas que tiver o ID de atividades mais não consegui entender, tentei essa query mais sem sucesso:

public List<Perguntas> perguntas(long id) {
	String jpql = "SELECT atividades FROM Atividades atividades JOIN FETCH perguntas JOIN perguntas pergunta WHERE pergunta.atividades.id = :id";
	
	Query query = conexao.createQuery(jpql, Perguntas.class).setParameter("id", id);
	List<Perguntas> perguntas = query.getResultList();
	
	return perguntas;
}

Para retornar todas as perguntas de uma determinada atividade, você pode fazer assim:

public List<Pergunta> consultarPerguntas(Atividade atividade) {
	String jpql = "SELECT pergunta FROM Pergunta pergunta WHERE pergunta.atividade = :atividade";
	
	TypedQuery query = conexao.createQuery(jpql, Pergunta.class);
	query.setParameter("atividade", atividade);
	
	List<Pergunta> resultList = query.getResultList();
	return resultList;
}

DICA: Nâo dê nomes no plural para suas classes. Uma classe chamada Atividades dá a entender que se trata de várias atividades, sendo que representa somente uma (um único registro no banco). Para representar várias atividades, você terá uma lista (List<Atividade> atividades)

lucastody, muito obrigado em poucas linhas você resolveu meu problema.
e eu consegui entender como funciona isso.

1 curtida