R2DBC映射以在数据库中的表之间建立关系

问题描述

如何在Spring数据R2DBC中使用地图,以获取具有已接收/已发送到数据库的关系的地图表/实体? 使用r2dbcCustomConversions,@ WritingConverter和@ReadingConverter。有人可以举一些例子吗?非常感谢

解决方法

也许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实例,以及从数据库中一起加载的链接列表。