Я пытаюсь сделать выбор из таблицы ассоциаций (из двух таблиц, имеющих отношение ко многим). Вот мои сущности:
Вопрос:
@Entity
@Table(name = "question")
public class Question {
@Id
private int id;
@Column(name = "question_text")
private String text;
@Column(name = "chapter_id")
private int chapterId;
@ManyToMany(mappedBy = "questions")
@Transient
public Set<Assessment> assessments = new HashSet<Assessment>();
public Question(int id, String text, int chapterId) {
this.id = id;
this.text = text;
this.chapterId =chapterId;
}
//getters setters
Оценка: * * 1006
@Entity
@Table(name = "assessment")
@Access(AccessType.FIELD)
public class Assessment {
@Id
private int id;
private String name;
@Column(name = "chapter_id")
private int chapterId;
private int grade;
private String type;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "assessment_question",
joinColumns = { @JoinColumn(name = "assessment_id") },
inverseJoinColumns = { @JoinColumn(name = "question_id") }
)
@Transient
@ElementCollection(targetClass=Question.class)
Set<Question> questions = new HashSet<Question>();
public Assessment(int id, String name, int chapterId, int grade, String type) {
super();
this.id = id;
this.name = name;
this.chapterId = chapterId;
this.grade=grade;
this.type=type;
}
//getters & setters
В схеме MySQL эти 2 сущности имеют таблицу ассоциаций оценивания_qution, имеющую в качестве ключей assessment_id
и question_id
.
Я пытаюсь прочитать записи из этой таблицы. Это метод DAO:
@Transactional
public List<Question> getQuestionsOfAssessment(int id) {
List<Question> list = null;
Configuration con = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Question.class);
SessionFactory sf = con.buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
try{
TypedQuery<Question> query=sf.openSession().createQuery("select q from Question q join q.assessments a where a.id = :id");
query.setParameter("id",id);
list = query.getResultList();
tx.commit();
session.close();
}catch(Exception e){
e.printStackTrace();
}
return list;
}
Однако я получаю следующее исключение:
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: assessments of: models.Question [select q from models.Question q join q.assessments a where a.id = :id]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:713)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:103)
at dao.AssessmentQuestionDAO.getQuestionsOfAssessment(AssessmentQuestionDAO.java:60)
at webapp.Main.main(Main.java:156)
Я много читал здесь о том, как использовать много ко многим и как решить это, но пока ничего не могло решить. Похоже, мне не хватает какой-то очень незначительной вещи, которую я, вероятно, не вижу. У вас есть идеи, как решить эту проблему?