如何在 r2dbc 中加入表?

Posted

技术标签:

【中文标题】如何在 r2dbc 中加入表?【英文标题】:How to join tables in r2dbc? 【发布时间】:2020-05-25 11:42:22 【问题描述】:

在java反应器中,r2dbc。我有两个表 A、B。我还为它们定义了存储库。 如何获取由 A 和 B 组成的数据?

我只想出以下方法: 从 A 调用 databaseClient.select,然后在循环中从 B 调用 select。

但我想要更有效和更被动的方式。怎么做?

【问题讨论】:

【参考方案1】:

TL;DR:使用 SQL。

Spring Data 的 DatabaseClient 是 R2DBC 的改进和反应式变体,JdbcTemplate 用于 JDBC。它封装了各种执行模式、资源管理和异常翻译。其流畅的 API 选择/插入/更新/删除方法适用于简单而扁​​平的查询。超出所提供 API 的所有内容均受 SQL 使用限制。

话虽如此,你要找的方法是DatabaseClient.execute(…)

DatabaseClient client = …;
client.execute("SELECT person.age, address.street FROM person INNER JOIN address ON person.address = address.id");

对于存储库 @Query 方法也是如此。

在结果处理期间调用数据库是锁定整个结果处理的好方法,因为结果是按流方式获取的。在尚未获取所有结果的情况下发出查询可能会耗尽 128 或 256 个项目的预取缓冲区并导致结果流卡住。此外,您正在创建一个 N+1 问题。

【讨论】:

您的方法的问题在于无法将结果映射到实体上。因此,让我们以人员和地址查询为例,我不知道如何将 select 的结果映射到任意实体 PersonalInfo(map() 除外) Spring Data R2DBC 首先不是对象关系映射器。您可以将单行映射到单个对象。您可以通过execute(…).as(PersonalInfo.class).fetch().all() 对所有结果使用基于约定的映射。

以上是关于如何在 r2dbc 中加入表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在名称作为参数提供的用户定义函数中加入表?

如何在 R2DBC 和 Spring WebFlux 中加入多个表?

在 TypeORM 和 NodeJS 中加入表

在 MySQL 中加入表的转置

在数据库架构中加入表?

通过在 iOS 中加入表从 Firebase 获取数据