#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. Выполнено. Еще раз спасибо.