spring-data-jpa 如何使用SpringBoot的JPA存储库中的Map从 Boot 中的多个表中获取数据

5rgfhyps  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(202)

我创建了四个实体类:

@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;
}

各个实体的表模式如下:
Jmeter 板区域国家/地区:

+----------------+---------------+
| 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沿着Region和该区域中的各个国家/地区。如上所述,我的表中只有region和country 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);
}

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

ct3nt3jp

ct3nt3jp1#

只需使用getById获取相应的DashboardRegionCountry(请查看参考文档),它将包含关联的CountryRegion。如果您不想公开实体中的所有CountryRegion信息,我建议您将它们Map到DTO,该DTO将是您在返回控制器上的某些内容时要使用的模型。

8nuwlpux

8nuwlpux2#

findByRegion_regionId尝试执行此操作,这将起作用。

相关问题