Вы бы не делали этого в Hibernate.Весь смысл использования hibernate заключается в том, что вы имеете дело с объектами.
Так что я думаю, что ваш класс Student будет иметь список типа Grade
@Entity
public class Student{
// accessors and id omitted
@OneToMany(mappedBy="student")
private List<Grade> grades;
}
@Entity
public class Grade{
// accessors and id omitted
@ManyToOne
private Student student;
}
Вы будете искать оценку с помощью session.get () и затем grade.getStudent()
для доступа к ученику:
Grade grade = (Grade) session.get(Grade.class, gradeId);
Student student = grade.getStudent();
HQL-запросы предназначены для сценариев, которые слишком сложны для этих методов поиска.
Редактировать: я только что понял, что вопрос помечен jpa
.Тогда, конечно, вы будете использовать не HQL, а JPQL.А также вы будете использовать этот код:
Grade grade = entityManager.find(Grade.class, gradeId); // no cast needed with JPA 2
Student student = grade.getStudent();
Изменить: учитывая требования, которые вы добавили в свои комментарии, я бы изменил модель данных на что-то вроде этого (идентификаторы опущены):
@Entity
public class Student{
public List<Course> getCourses(){
return courses;
}
public void setCourses(List<Course> courses){
this.courses = courses;
}
@OneToMany(mappedBy="student")
private List<Course> courses;
}
@Entity
public class Course{
@ManyToOne(optional=false)
private Student student;
@ManyToOne(optional=false)
private Grade grade;
public void setStudent(Student student){
this.student = student;
}
public Student getStudent(){
return student;
}
public Grade getGrade(){
return grade;
}
public void setGrade(Grade grade){
this.grade = grade;
}
}
@Entity
public class Grade{
@OneToMany(mappedBy="grade")
private Set<Course> courses;
public void setCourses(Set<Course> courses){
this.courses = courses;
}
public Set<Course> getCourses(){
return courses;
}
}
И я бы спросил так:
Grade grade = entityManager.find(Grade.class, 1L);
List<Student> studentsWithThisGrade = new ArrayList<Student>();
for(Course course : grade.getCourses()){
studentsWithThisGrade.add(course.getStudent());
}
(Но Grade, вероятно, должен быть не сущностью, а числовым значением или перечислением.)
Оказывается, в конце концов OP использует обычный режим гибернации, а не JPA.Поэтому всякий раз, когда вы видите entityManager.find()
выше, замените это в своем уме на session.get()
: -)