Множество исключений org.hibernate.hql.internal.ast.QuerySyntaxException «не сопоставлено»

#hibernate

#переход в спящий режим

Вопрос:

Я разрабатываю приложение с использованием: Eclipse, Jsf, Hibernate, WildFly, Primefaces.

И у меня проблема с «не сопоставленным» режимом гибернации, и да, я знаю, что мы должны использовать имена сущностей вместо имен таблиц. Я новичок здесь и не уверен, как все делать правильно.

Автоматически созданная таблица — aluno_turma, как я ни старался, ничего не смог с этой таблицей сделать.

Я просмотрел каждый ответ на все вопросы о «не сопоставлено» и перепробовал все, но не смог заставить это работать.

Спасибо за любую помощь.

Коды следующие:

Aluno.java

 @Entity
@ManagedBean
@Table(name = "Aluno")
public class Aluno implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id;
...
    @ManyToMany
    @JoinTable(name="aluno_turma",
            joinColumns={           @JoinColumn(name="aluno_id")},
            inverseJoinColumns={    @JoinColumn(name="turma_id")})
    private List<Turma> turmas = new ArrayList<Turma>();

...
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
  

Turma.java

     @Entity
    @ManagedBean
    public class Turma implements Serializable{

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY) 
        private Integer id;
        private String  nome;
        private Integer diaSemana;
        private String  hora;
        private String  observacao;
        private Boolean inativo;

        @ManyToOne
        private Modalidade modalidade;

        @ManyToMany
        @JoinTable(name="aluno_turma",
                joinColumns={           @JoinColumn(name="turma_id")},
                inverseJoinColumns={    @JoinColumn(name="aluno_id")})
        private List<Aluno> alunos = new ArrayList<Aluno>();
    ...
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }

alunoMBean.java

@ManagedBean(name="alunoBean")
@SessionScoped
public class AlunoMBean implements Serializable {
...
    private List<Turma> turmas;
...
    public List<Turma> getTurmas() {
        if(this.aluno.getNome() == null) {
            List<Turma> listTurma = new ArrayList<Turma>();
            return listTurma;
        }
        if(this.turmas == null) { //Só busca na tabela a primeira vez da consulta
            this.turmas = alunoDao.getTurmas(aluno, flagTurma);
        }
        return this.turmas;
    }
  

alunoDao.java

 public List<Turma> getTurmas(Aluno aluno, Boolean flag) {

    List<Turma> turmas = new ArrayList<Turma>();
    turmas = em.createQuery("from Turma where inativo = 0 and id in ( select turma_id from aluno_turma where aluno_id = "  aluno.getId() " ) order by nome ", Turma.class).getResultList();
    //That doens't work: Not Mapped

    //turmas = em.createQuery("from Turma order by nome ", Turma.class).getResultList();
    //That works

    return turmas;
}
  

Ошибки

 01:43:16,105 ERROR [org.jboss.as.ejb3.invocation] (default task-14) WFLYEJB0034: EJB Invocation failed on component AlunoDao for method public java.util.List br.com.mvtech.alumni.dao.AlunoDao.getTurmas(br.com.mvtech.alumni.modelo.Aluno,java.lang.Boolean): javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: aluno_turma is not mapped [from br.com.mvtech.alumni.modelo.Turma where inativo = 0 and id in ( select turma_id from Aluno_turma where aluno_id = 2 ) order by nome ]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:187)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:277)
  

Ответ №1:

Вы создаете запрос JPQL, но используете поля SQL. JPQL действительно использует структуру объекта для синтаксиса, а не структуру таблицы.

Вы можете попробовать следующее:

 Query query = em.createQuery("FROM Turma WHERE inativo = false and :aluno MEMBER OF alunos order by nome");
query.setParameter("aluno", aluno);
query.getResultList();
  

Комментарии:

1. Выполнено. Еще раз спасибо.