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

Duvida HQL

Estou com uma duvida com HQL :

modelo:

package br.com.quiz.model;

import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;

@Entity
public class Perguntas {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Lob
    private String enunciado;

    @ElementCollection
    private List<Respostas> respostas;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEnunciado() {
        return enunciado;
    }

    public void setEnunciado(String enunciado) {
        this.enunciado = enunciado;
    }

    public List<Respostas> getRespostas() {
        return respostas;
    }

    public void setRespostas(List<Respostas> respostas) {
        this.respostas = respostas;
    }

    @Override
    public String toString() {
        return "Perguntas [id=" + id + ", enunciado=" + enunciado + "]";
    }

}
package br.com.quiz.model;

import javax.persistence.Embeddable;

@Embeddable
public class Respostas {

    private String opcao;
    private String ehCorreta;

    public Respostas() {
    }

    public Respostas(String opcao, String ehCorreta) {
        this.opcao = opcao;
        this.ehCorreta = ehCorreta;
    }

    public String getOpcao() {
        return opcao;
    }

    public void setOpcao(String opcao) {
        this.opcao = opcao;
    }

    public String getEhCorreta() {
        return ehCorreta;
    }

    public void setEhCorreta(String ehCorreta) {
        this.ehCorreta = ehCorreta;
    }

    @Override
    public String toString() {
        return "Respostas [" + "opcao= " + opcao + "]";
    }

}

eu preciso fazer uma query que faça um join entre as entidades: Perguntas join Respostas, mas como optei por usar embaddable não precisei deixar explicito um ID para Respostas.

Nesse caso foi criado uma tabela Perguntas_Respostas que tem como PK a minha id de Perguntas. Como eu posso gerar um HQL e fazer um join por id, se na minha Entidade Respostas eu n tenho uma referencia para chave que foi criada no banco Perguntas_id.


    public Perguntas getPergunta(int id) {
        String query = "from Perguntas p where p.id = :id";
        return manager.createQuery(query, Perguntas.class).setParameter("id", id).getSingleResult();

    }

    public List<Respostas> getRespostas(int id) {
        String query =  "FROM Respostas r where r.respostas_id = :id"; // /??????????DUVIDA AQUI???????????? 
        return manager.createQuery(query, Respostas.class).setParameter("id", id).getResultList();
    }
5 respostas

Consegui aqui

HEUHEUE StackOverflow <3

Se você está fazendo where no campo de id, não está usando HQL ao seu máximo. Porém, como você não tem um objeto que represente a tabela Pergunta_Respostas, pode ser que isso dificulte sua vida.

Uma alternativa seria você fazer uma mudança na sua modelagem incluindo a Pergunta nas suas Respostas, já que uma dada Respostas só pode pertencer a uma única Pergunta.

Aí sua query poderia ser algo assim:

public List<Respostas> getRespostas(Pergunta pergunta) {
    String query =  "FROM Respostas r where r.pergunta = :pergunta";
    return manager.createQuery(query, Respostas.class)
        .setParameter("pergunta", pergunta).getResultList();
}

Não tenho certeza absoluta que você possa passar o objeto pergunta como parâmetro, mas se não puder, basta trocar r.pergunta para r.pergunta_id e o valor do parâmetro para pergunta.getId().

Julio, já que você resolveu o problema, explique aqui como resolveu! Isso pois um aluno com a mesma dúvida pode ficar frustrado ao pensar que vai encontrar uma resposta adequada aqui e se deparar somente com uma referência ao SE.

Explique melhor qual foi sua solução e marque novamente como solução =)

solução!

minha duvida na verdade era mais sobre sintaxe, a sintaxe correta para oque eu queria fazer é :

public Perguntas getPergunta(int id) {
        String query = "from Perguntas p join fetch p.respostas r where p.id = :id";
        return manager.createQuery(query, Perguntas.class).setParameter("id", id).getSingleResult();

    }

Descobri que como o HQL é bem inteligente eu n preciso indicar com qual campo eu vou fazer o join. Se eu passo a referencia que eu uso como relação , ele consegue se virar.

Exatamente isso! Marquei a sua resposta mais clara como solução, ok?

Bons estudos! =D