繁体   English   中英

如何在 Spring 数据 R2DBC 中 map 一对多/一对一到 POJO

[英]How to map One to Many / One to One to a POJO in Spring Data R2DBC

我正在尝试在新的反应数据 r2dbc 中复制我在 Spring 数据 JPA 中使用的一些功能。 我知道 r2dbc 不是成熟的 ORM 但想了解在 r2dbc 中复制以下场景的最佳方法是什么:

public class Doctor extends BaseModel {

    //other fields and id

    @NotNull
    @Enumerated(EnumType.STRING)
    @ElementCollection(fetch = FetchType.LAZY, targetClass = Language.class)
    @CollectionTable(name = "doctor_language",
        joinColumns = @JoinColumn(name = "doctor_id"))
    @Column(name = "language")
    private List<Language> languages = new ArrayList<>();


    @OneToMany(fetch = FetchType.LAZY, targetEntity = DoctorHealthProvider.class, mappedBy = 
        "doctor")
    private List<DoctorHealthProvider> providers = new ArrayList<>();

    // other fields
}

health_provider我使用doctor数据doctor_language

我正在阅读有关预测的内容,但似乎无法找出在 Reactive Spring 中实现上述内容的最佳方法。 任何帮助/指南/方向表示赞赏。

谢谢

你可以看看https://github.com/lecousin/lc-spring-data-r2dbc但看起来还没有完全准备好使用。 但是,如果您的需求不是太复杂,它可能会完成这项工作。

例如,您可以声明这样的链接:

@Table
public class TableWithForeignKey {
  ...
  @ForeignKey(optional = false)
  private LinkedTable myLink;
  ...
}

@Table
public class LinkedTable {
  ...
  @ForeignTable(joinkey = "myLink")
  private List<TableWithForeignKey> links;
  ...
}

当您想要映射链接时,您可以使用延迟加载或 select 与连接。

如果使用 Spring 存储库的方法findBy... (findById, findAll...),则只会加载存储库的表。 在这种情况下,您可以使用延迟加载。 为此,您需要声明一个具有默认主体的方法,并且您的方法将自动实现:

  public Flux<TableWithForeignKey> lazyGetLinks() {
    return null; // will be implemented
  }

另一种方法是直接在请求中进行连接。 当前不支持在存储库中自动执行连接(如 JPA 中的 @EntitiGraph),但您可以像这样实现您的方法:

public interface MyRepository extends LcR2dbcRepository<LinkedTable, Long> {
  
  default Flux<LinkedTable> findAllAndJoin() {
    SelectQuery.from(LinkedTable.class, "root") // SELECT FROM LinkedTable AS root
      .join("root", "links", "link")            // JOIN root.links AS link
      .execute(getLcClient());                  // execute the select and map entities
  }

}

结果将是所有 LinkedTable 实例,以及从数据库一起加载的链接列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM