Problema com INNER JOIN no HQL [Resolvido]

Olá pessoal,

estou com um problema no hibernate!

Tenho as classes Curso e Disciplina; (Só coloquei os campos que estou tendo problema)

public class Curso implements Serializable { ... @OneToMany(mappedBy = "curso") private List<Disciplina> disciplina; ... }

public class Disciplina implements Serializable { ... @OneToOne(cascade = CascadeType.ALL) private Curso curso; ... }

Quando eu tento executar um JOIN no HQL, dá pau…

HQL ==>>

public List<Curso> filtrar() throws Exception{ String hql = "FROM Curso curso " + "INNER JOIN curso.disciplina AS disciplina"; return (List<Curso>) session.createQuery(hql).list(); }

Se eu tirar esta linha: “INNER JOIN curso.disciplina AS disciplina” dá certo…

Eu mando roda o programa e blz, mas quando eu tento instanciar a classe, ai dá pau por exemplo

Curso curso = listaCurso.get(i)

O problema é que o hibernate não consegue preencher a classe Curso e a listaDisciplinas que tem dentro de Curso, isso e só quando eu tendo usar HQL

Se eu usar com Criteria dá certo, assim dá certo:

public List<Curso> filtrar() throws Exception{ return (List<Curso>) session.createCriteria(Curso.class).list(); }

Os dois jeito ele gera o mesmo SQL, só que com HQL ele não consegue preencher… tem que fazer alguma coisa para sincronizar a classe Curso quando uso HQL?

LEBRANDO QUE TEM QUE SER COM “HQL”. Para mim não serve o Criteria…

Dá este erro:

SEVERE: null java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.dto.Curso

Alguem sabe porque isso?

KRa, tente isso

    public List<Curso> filtrar() throws Exception{  
            String hql = "SELECT curso FROM Curso curso " +   
                              "INNER JOIN curso.disciplina AS disciplina";  
            return (List<Curso>) session.createQuery(hql).list();  
    }  

Um dia tive este problema e acho que esta era a solução.

Boa sorte

Então eu tentei isso, deu certo, mas ai como eu faço para preencher o List<Disciplina> dentro da classe Curso…?

Ele já vai ser pego automatico devido ao relacionamento bidirecional.

PAra acessar ele, apenas de o getdisciplina() que vc pegara as disciplinas.

falo

Legal deu certo, mas o problema que ele executa um SELECT para cada getDisciplina(). Para mim gerar um relatorio com 100 cursos e cada curso ter um monte de disciplina ai vai ficar bem pesado…

Não tem como pegar naquele comando INNER JOIN…?

Consegui…

Vlw cara…

Ficou assim:

public List&lt;Curso&gt; filtrar() throws Exception{
    String hql = "FROM Curso curso " +
                      "LEFT JOIN FETCH curso.disciplina";

    return session.createQuery(hql).list();
}

Estava faltando só o comando: FETCH…