14

在 java 反应器中,r2dbc。我有两个表 A、B。我还为它们定义了存储库。我怎样才能得到由 A 和 B 组成的数据?

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

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

4

1 回答 1

15

TL;DR:使用 SQL。

Spring Data是用于 JDBCDatabaseClient的 R2DBC 的改进和反应式变体。JdbcTemplate它封装了各种执行模式、资源管理和异常翻译。其流畅的 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 问题。

于 2020-02-10T20:24:35.153 回答