问题描述
如何在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实例,以及从数据库中一起加载的链接列表。