如何使用Spring JPA联接三个表

时间:2018-08-30 20:20:51

标签: sql database oracle join spring-data-jpa

我需要有关Spring JPA的帮助。

我有一个请求中附带的ID,我需要检索2个字段-itemsOrdered,itemDelivered从2个表中。

这些表之间的关系不是很简单,如下所示。 enter image description here

表A的ID(来自请求)为PK。 表A与表B具有外键关系。 表B与表C,表D具有外键关系。

现在要阅读itemsOrdered,itemDelivered,我要一一阅读。

A a = CrudRepository.findOne(id from request);
B b = CrudRepository.findOne(A.getID());
C c = CrudRepository.findOne(B.getID());
D d = CrudRepository.findOne(B.getID());

反正有进行联接的步骤,以便我可以一步完成C.itemsOrdered和d.itemsDelivered吗?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Hibernate 5.1+(或简单地说是Spring Boot 2.0+),则可以像常规SQL一样在JPQL查询中使用“带条件联接”,例如:

select 
  c.itemsOrdered, 
  d.itemsDelivered 
from 
  A a 
  join B b on b.a_id = a.id 
  join C c on c.b_id = b.id 
  join D d on d.b_id = b.id 
where 
  a.id = ?1

借助projections,您可以轻松地检索这些字段:

public interface TwoFieldsProjection {
   Long getItemsOrdered();
   Long getItemsDelivered(); 
}

@Query("select c.itemsOrdered as itemsOrdered, d.itemsDelivered as itemsDelivered from A a join B b on b.a_id = a.id join C c on c.b_id = b.id join D d on d.b_id = b.id where a.id = ?1")
Optional<TwoFieldsProjection> getTwoFields(Long aId);

请注意在查询(c.itemsOrdered as itemsOrdered)中使用别名,该别名必须与投影中的getter匹配。