如何使用 Spring Data JPA Repository 从 2 个表中查询?

Posted

技术标签:

【中文标题】如何使用 Spring Data JPA Repository 从 2 个表中查询?【英文标题】:How to use Spring Data JPA Repository to query from 2 tables? 【发布时间】:2015-01-12 07:40:53 【问题描述】:

我有 2 个表,分别是 Student 和 Teacher,并说 Student 与 Teacher 具有多对一关系,并说 teacherId 作为外键。

如果我想查询类似下面的内容,我该如何使用 spring data JPA repo 方法 - findByTeacherName

select * from Student S, Teacher T 
    where T.teacherName = 'SACHIN' and S.teacherId = T.teacherId

注意:这里我只想使用StudentRepository 进行查询,它是使用与TeacherHibernateMapping 类有关系的StudentHibernateMapping 类创建的

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

关于@prateek-singh 的实体,也应该可以定义完全没有id 的查询,只需通过外部实体即可。

List<Student> findByTeacher(Teacher teacher);

【讨论】:

这也适用于我,还有一个由 Prateek Singh 提供的。【参考方案2】:

StudentRepository上会有一个repository方法

List<Student> findByTeacher_TeacherId(String teacherId);

你的 entityClass 应该是这样的..

@Entity
Class Student 
  @Id
  String studentId;
  @ManyToOne
  private Teacher teacher;

而教师班将是..

@Entity
Class Teacher 
  @Id
  private String teacherId;

这里你需要知道的关键是:

findBy +(学生类的外键成员首字母大写)+下划线+教师类的数据成员首字母大写 +(String teacherId) ;

这将为您提供属于该教师的学生列表

【讨论】:

很好的解决方案。我想知道这种方法是否记录在某处。到目前为止我找不到任何东西。 嗨@LiangZhou 给你..docs.spring.io/spring-data/jpa/docs/current/reference/html/… 我们甚至不需要在方法中添加underscore .. 例如:List&lt;Student&gt; findByTeacherTeacherId(String teacherId); 这也可以。【参考方案3】:

有很多方法可以做到这一点,请阅读解释嵌套属性使用的 method naming 约定,或者对于更复杂的查询,请使用 @Query annotation。

【讨论】:

谢谢@zoran。特别是,我只想了解是否支持在 where 子句等效项中组合 2 个表,例如 findByTeacherIdAndStudentId。不过我知道它适用于 NativeSQl。

以上是关于如何使用 Spring Data JPA Repository 从 2 个表中查询?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Jpa问题在一个事务中保存父,子和childofchild

使用 spring-data-jpa 获取这些数据如何更正确?

处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型

如何使用 spring4+spring-data-jpa(hibernateJpaVendorAdapter)+multidatasource+one entityManager+jpaReposit

从控制台应用程序使用带有休眠功能的spring-data-jpa时如何延迟加载收集

如何使用 Spring Data JPA 连接两个表