1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro NamedQuery

Está apresentando o seguinte erro na minha named query

org.hibernate.QueryException: illegal attempt to dereference collection [alunos0_.matricula.turma] with element property reference [id] [select a from br.com.colegio.model.Alunos a where a.turma.id = :id_turma]

Segue as duas Entidades:

@Entity
@NamedQuery(query = "select t from Turmas t", name = "getAllTurmas")
public class Turmas {

    @Id
    @GeneratedValue
    private Long id;

    private int nivel;

    private int serie;

    private String periodo;

    private int anoTurma;

    @ManyToMany(mappedBy = "turma")
    private Collection<Alunos> alunos = new ArrayList<Alunos>();


/* getters e setters */

}

:)

@Entity
@NamedQueries({
        @NamedQuery(query = "select a from Alunos a", name = "getAllAlunos"),
        @NamedQuery(query = "SELECT a FROM Alunos a WHERE a.turma.id = :id_turma", name = "getAlunoByTurma") })
public class Alunos {

    @Id
    private Long matricula;

    private String nome;

    private Long rg;

    private String nomeResponsavel;

    private Long rgResponsavel;

    private String cpfResponsavel;

    private String pai;

    private String mae;

    @ManyToMany
    private Collection<Turmas> turma;

    @Temporal(TemporalType.TIMESTAMP)
    private Calendar dataDeNascimento;

/* getters e setters*/
  • Só uma dica em relação ao nome de suas classes, Alunos representa um aluno, e não muitos alunos. Quando você faz Alunos al = new Alunos(); você está criando apenas um aluno, o mesmo vale para Turma, eu sugiro que remova esses "s" (plural), do nome de suas classes.

    Douglas Arantes   12 de ago de 2014
  • o Erro acontece pois você está tentando navegar em uma lista. Sua entidade Alunos tem uma Lista de turma e na sua query você está tentando navegar como se fosse apenas um objeto. Tente SELECT a FROM Alunos a JOIN FETCH a.turma turma WHERE turma.id = :id_turma" .. Verifique também seu relacionamento se realmente é N para N.

    cissoide   12 de ago de 2014
  • Obrigado cissoide, Pode criar uma resposta pra eu poder marcá-la como certa? E vlw Douglas! É que no caso esta aplicação está sendo feita por mim meramente para estudos, não me atentei muito a nomes de classes, mais ao uso das tecnologias e alguns padrões de projeto. Fiquei com preguiça de ter o trabalho de alterar o nome de tabelas/campos e usei o mesmo da classe haha

    Jezz   12 de ago de 2014
  • Ok, mas lembre que o nome de suas classes, atributos, métodos, são muito importantes.

    Douglas Arantes   12 de ago de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa hibernate sql mysql ou faça a sua própria pergunta.