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

Posted

技术标签:

【中文标题】如何使用 Spring Data JPA 连接两个表【英文标题】:How to join two tables using Spring Data JPA 【发布时间】:2017-11-08 11:16:52 【问题描述】:

我有两个类似于以下的实体:

Doctor:
@Id
@Column(name = "ID", nullable = false, updatable = false)
private Long id;
...

DoctorSpeciality:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, updatable = false)
private Long id;

@ManyToOne
@JoinColumn(name = "DOCTOR_ID")
private Doctor doctor;

@ManyToOne
@JoinColumn(name = "SPECIALITY_ID")
private Speciality speciality;

我想加入这些,通过 DoctorRepository 使用 JPA 规范检索给定 SpecialityId 的所有医生。

有人可以帮我解决这个问题吗?

【问题讨论】:

FWIW 没有“JPA 规范”或“JPA 存储库”或“JPA 查询”之类的东西。那就是 Spring Data JPA (!= JPA API)。标签固定 【参考方案1】:

在你的DoctorRepository 试试这个

@Query("Select d from Doctor d where d.speciality.id = :id")
List<Doctor> findAllBySpeciality(@Param("id") long id);

更新 1:使用您提供的映射,以下 JPQL 正在运行。

@Query("Select ds.doctor from DoctorSpeciality ds where ds.speciality.id = :id")
List<Doctor> findAllBySpeciality(@Param("id") long id);

【讨论】:

我已成功运行此查询:select * from doctor join doctor_speciality on doctor.id= doctor_speciality.doctor_id where doctor_speciality.speciality_id=2 但我想使用 JPA 规范实现同样的目标。 @Ganesan 检查更新的答案。此 JPQL 正在我的机器上成功运行。 我上面说的查询工作正常。但我想通过这样的规范来做到这一点:public static Specification&lt;Doctor&gt; findBySpeciality(Speciality speciality) return (root, query, cb) -&gt; Join&lt;Doctor, DoctorSpeciality&gt; specialityDoctor = root.join("doctor"); Join&lt;DoctorSpeciality, Speciality&gt; specialityRelation = specialityDoctor.join("speciality"); return cb.equal(specialityRelation.get("speciality"), speciality); ; 它不起作用,我需要帮助。

以上是关于如何使用 Spring Data JPA 连接两个表的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Data JPA 中连接两个表实体

Spring Data JPA:创建规范查询获取连接

如何在 Spring Data JPA 中更改数据库连接?

如何使用Spring Data JPA搜索非唯一索引?

spring-data-jpa 如何使用多个数据源? [复制]

如何与 Spring Data REST 和 JPA 保持双向关系?