【问题标题】:How to fetch data from multiple tables in spring boot using mapping in Spring Boot's JPA repository如何使用 Spring Boot 的 JPA 存储库中的映射从 Spring Boot 中的多个表中获取数据
【发布时间】:2025-12-17 01:55:02
【问题描述】:

我创建了四个实体类:

@Entity
@Table(name = "DashboardRegionCountry")
public class DashboardRegionCountry implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "dashboardId")
    private long dashboardId;

    @OneToOne(targetEntity = Country.class)
    @JoinColumn(name="countryId")
    private Country country;
    
    @OneToOne(targetEntity = Region.class)
    @JoinColumn(name="regionId")
    private Region region;

    @ManyToOne()
    @JoinColumn(name="dashboardId")
    private Dashboard dashboard;
}

@Entity
@Table(name = "Dashboard")
public class Dashboard implements Serializable {

    @Id
    @Column(name = "dashboardId")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long dashboardId;

    @Column(name = "dashboardName")
    private long dashboardName;

    @OneToMany(mappedBy= dashboard)
    private List<DashboardRegionCountry> dashboardRegionCountry;
    
}

@Entity
@Table(name = "Country")
public class Country implements Serializable {

    @Id
    @Column(name = "countryId")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long countryId;

    @Column(name = "shortName")
    private String shortName;
    
    @Column(name = "longName")
    private String longName;
 
}

@Entity
@Table(name = "Region")
public class Region implements Serializable {

    @Id
    @Column(name = "regionId")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long regionId;

    @Column(name = "shortName")
    private String shortName;
    
    @Column(name = "longName")
    private String longName;
}

各个实体的表架构如下:

DashboardRegionCountry:

+----------------+---------------+
| Field          | Type          |
+----------------+---------------+
| id(PK)         | Number(11)    |
| dashboardId(FK)| Number(11)   |
| countryId      | Number(11)    |
| regionId       | Number(11)   |
+-------------+------------------+

Dashboard:

+----------------+---------------+
| Field          | Type          |
+----------------+---------------+
| dashboardId(PK)| Number(11)    |
| dashboardName  | varchar(11)   |
+-------------+------------------+

Country:
+-------------+---------------+
| Field       | Type          |
+-------------+---------------+
| countryId(PK)| Number(11)   |
| shortName   | Varchar2(10)  |
| longName    | Varchar2(10)  |
+-------------+---------------+

Region:
+-------------+---------------+
| Field       | Type          |
+-------------+---------------+
| regionId(PK)| Number(11)    |
| shortName   | Varchar2(10   |
| longName    | Varchar2(10)  |
+-------------+---------------+

基本上,当用户输入dashboardId 时,我们想要获取dashboardDetails 以及该地区的地区和相应的国家。如上所述,我的表中只有地区和国家 ID,它们的名称出现在其他表中。 我想显示我的示例输出,例如:

{
 "dashboardId":20,
  "DashboardRegionCountry": [{
    "Region":"ASIA",
    "dashboardId":["India","China"]
  },
  {
    "Region":"NAM",
    "dashboardId":["USA","Canada"]
  }
  ]
}

我正在尝试编写 JPA 存储库,但想知道是否可以编写如下内容:

@Repository
public interface DashboardRegionCountryRepository extends JpaRepository<DashboardRegionCountry, Long>{

    List<Map<Long,Country>> findRegionBy_RegionId(Long dashboardId);
}

我正在尝试在一个查询中获取所有数据,任何建议都会非常有帮助

【问题讨论】:

    标签: java spring spring-boot hibernate spring-data-jpa


    【解决方案1】:

    只需使用getById(检查reference documentation)获取对应的DashboardRegionCountry,它将同时包含关联的CountryRegion。如果您不想在您的实体中公开所有 CountryRegion 信息,我建议您将它们映射到 DTO,这将是您在控制器上返回某些内容时要使用的模型。

    【讨论】:

    • 您好先生,我已经更新了问题,如果我这样做findByDashboardRegionCountry_dashBoardId,它也会获取我不需要的仪表板详细信息。此外,它正在触发多个查询,有没有办法使用单个查询并仅获取地区和国家/地区?
    • 为此,您需要使用 @Query 编写自己的自定义查询 --> baeldung.com/spring-data-jpa-query
    最近更新 更多