如何在Spring Data R2DBC中将一对多/一对一映射到POJO

6

我正试图在新的响应式数据r2dbc中复制我在Spring Data 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
}

如果我使用Spring Data JPA,对DoctorRepository (JpaRepository的扩展)调用一个简单的findById方法,将会给我返回一个带有来自doctor_language表的语言列表和来自health_provider表的健康提供商列表的doctor对象。

我正在阅读关于投影的文章,但似乎无法想出在响应式Spring中实现上述内容的最佳方法。任何帮助/指导/方向都将不胜感激。

谢谢


2
目前R2DBC不支持像这样的自动关系加载。 - nicholasnet
不是非常好的解决方案,但您可以使用特殊的存储库片段,其中包含一个方法,该方法将返回包含一对多实体的接口。但仍需要提供自定义实现(易于实现)。 - Mister_Jesus
2个回答

0

您可以查看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;
  ...
}

当您希望映射链接时,您可以使用惰性加载或选择连接。

如果您使用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实例,从数据库中一起加载链接列表。


你能否详细说明链接内容,并提供帮助来回答问题,而不仅仅是引用它? - Aymen Alsaadi

0

或者尝试Micronaut框架,它采用了所有现有框架的优点,并在Spring / SpringBoot中提供了许多缺失的功能。

例如,Micronaut Data R2dbc提供了一组注释(包括一对多,多对多,嵌入式)来定义类似JPA的关系,更简单的方法是使用JPA注释和类似JPA的Specifciation通过类型安全的Criteria API自定义查询。

通过https://micronaut.io/launch/创建Web应用程序,将R2dbc和数据库驱动程序添加到依赖项中,您可以轻松地将Spring体验带到Micronaut中,无需额外努力。

我的Micronaut Data R2dbc示例:https://github.com/hantsy/micronaut-sandbox/tree/master/data-r2dbc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接