使用JPA、Hibernate或Spring注释来指定关系查询?

3

我可以使用JPA或Hibernate注释显式指定要运行的查询以检索关联对象吗?

具体来说,我有以下实体: Tutor(导师), Student(学生), 以及Tutor和Student之间的显式OneToOne关系,Tutorial(教程):

@Entity
public class Student {
  @OneToMany Collection<Tutorial> tutorials;
}

@Entity
public class Tutor {
  @OneToMany Collection<Tutorial> tutorials;
}

@Entity
public class Tutorial {
  @OneToOne Tutor tutor;
  @OneToOne Student student;
  // other data
}

在教程中,导师可以给学生分配作业(但不能是被未分配到的导师),因此:

@Entity
public class Homework { 
   @ManyToOne Tutorial tutorial;
   // other data
}

现在我想检索学生的所有作业:
@Entity
public class Student {
  @OneToMany Collection<Tutorial> tutorials;

  @OneToMany Collection<Homework> homework;
}

但是一份作业没有学生,它有一个教程。这在SQL中很容易表达:

select a.* 
from Homework a 
join Tutorial b on (a.tutorial_id = b.id)
where b.student_id = ?student.id?

我能否使用JPA或Hibernate或Spring注解直接在学生类中表达这个问题,以便在调用Student.getHomework()时使用?
换句话说,我想要的是:
@Entity
public class Student {
  @OneToMany Collection<Tutorial> tutorials;

  @ExplicitQuery("select Homework where Homework.student = this or something")
  @OneToMany Collection<Homework> homework;
}
1个回答

3

您可以通过使用自定义加载器在Hibernate中完成此操作。

@Entity
@NamedNativeQuery(name="customHomeworkLoader", query="select a.* from Homework a join Tutorial b on (a.tutorial_id = b.id) where b.student_id = ?", resultClass = Homework.class)
public class Student {
  @OneToMany Collection<Tutorial> tutorials;

  @Loader(namedQuery = "customHomeworkLoader")
  @OneToMany Collection<Homework> homework;
}

命名查询中的位置参数 (?) 应该在运行时自动替换为主键。我没有尝试过这个代码,所以不能保证它会工作,但希望它能给你一些提示,让你知道如何继续。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接