ОК, я думаю, что в моем понимании JPA / Hibernate есть некоторые недостатки.У меня есть две таблицы: STUDENTS, которая представляет студента, и CC, которая представляет назначение студента в класс.Таблица CC имеет столбец STUDENTID, который относится к студенту.Я пытаюсь сделать простой запрос, в котором я возвращаю записи CC с соответствующими записями студентов.Мой класс CC выглядит следующим образом (много вещей удалено):
@Entity
@Table(name="cc")
public class CC {
...
@Column(name="studentid", nullable=false, updatable=false)
private Integer studentid;
@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumns({ @JoinColumn(name="studentid", referencedColumnName="id",
insertable=false, updatable=false) })
private Student student;
...
}
Я должен указать referencedColumnName, потому что «ID» не является первичным ключом таблицы STUDENTS.Я пытаюсь выполнить запрос следующим образом:
EntityManager em = getCurrentEntityManager();
Query query = em.createQuery ( "select cc from CC cc inner join fetch cc.student where cc.sectionid=:sectionid");
query.setParameter("sectionid", sectionId);
List<CC> rows = query.getResultList();
if (!CollectionUtils.isEmpty(rows)) for (CC cc: rows) {
Student student = cc.getStudent();
//// PROBLEM: student object is null here (though studentid is correct)!
}
Я вижу, что hibernate правильно выполняет запрос, объединяет таблицы и даже возвращает столбцы таблицы ученика в проекции запроса:
select cc0_.dcid as dcid21_0_, student1_.DCID as DCID7_1_, cc0_.course_number as course2_21_0_,
... student1_.FIRST_NAME as FIRST28_7_1_, student1_.GENDER as GENDER7_1_, ...
from cc cc0_ inner join STUDENTS student1_
on cc0_.studentid=student1_.ID where cc0_.sectionid=?
Проблема, как отмечалось выше, заключается в том, что подобъект «студент» в CC всегда равен нулю, даже если столбец STUDENTID не равен нулю и является правильным.Я уверен, что я делаю что-то не так, но что?