编写JPQL内连接查询遇难题,寻求技术解决方案
解决JPQL内连接查询的问题
首先得先修正你实体类映射的几个问题,这是写对JPQL的前提:
1. 补充并修正实体类映射
你漏掉了Quotation实体的定义,而且现有Order实体的外键映射也和数据库表不匹配,先把这部分调整好:
补充Quotation实体
@Entity public class Quotation { @Id private long id; // 对应数据库表的q_id字段 @OneToOne @JoinColumn(name = "qr_id") // 关联QRequest的id(对应数据库的qr_id字段) private QRequest qRequest; // 记得添加getter、setter和必要的构造方法 }
修正Order实体的关联字段
你的Order表外键是quotation_id,对应Quotation的q_id(也就是Quotation的主键id),所以要调整@JoinColumn的配置:
@Entity @Table(name = "Order_") public class Order { @Id @GeneratedValue private long id; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "quotation_id", referencedColumnName = "id") // name指定Order_表的外键列,referencedColumnName指定Quotation的主键列 private Quotation quotation; // getter、setter等方法 }
2. 编写JPQL内连接查询
现在实体映射正确了,就可以基于实体间的关联关系写内连接查询了,以下是几种常见场景:
查询所有关联的完整数据
如果需要获取Order、对应的Quotation和QRequest的全部信息:
SELECT o, q, qr FROM Order o JOIN o.quotation q JOIN q.qRequest qr
查询指定字段
比如只需要Order的id和QRequest的name:
SELECT o.id, qr.name FROM Order o JOIN o.quotation q JOIN q.qRequest qr
带条件的内连接查询
如果要筛选特定name的记录,比如查询name为"Name 1"的相关数据:
SELECT o, q, qr FROM Order o JOIN o.quotation q JOIN q.qRequest qr WHERE qr.name = 'Name 1'
注意:JPQL的内连接是基于实体的关联关系来实现的,不需要像原生SQL那样手动写ON条件,JPA会根据你定义的实体关联自动生成对应的关联条件。
内容的提问来源于stack exchange,提问作者Parag Kadam
相关产品推荐
相关产品推荐

