【问题标题】:How to join three tables using Spring JPA如何使用 Spring JPA 连接三个表
【发布时间】:2019-02-05 20:35:54
【问题描述】:

我需要一些有关 Spring JPA 的帮助。

我有一个请求中的 ID,我需要检索 2 个字段 - itemsOrdered、itemsDelivered 来自 2 个表。

这些表之间的关系并不简单,如下所示。

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

现在要读itemsOrdered,itemsDelivered,我一一做。

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?

【问题讨论】:

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


    【解决方案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 匹配。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 2022-09-28
      • 2018-11-30
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2018-10-03
      • 2023-02-26
      相关资源
      最近更新 更多