如何连接 r2dbc 中的表?
How to join tables in r2dbc?
在 java 反应器中,r2dbc。我有两个表 A、B。我还为它们定义了存储库。
如何获取由 A 加入 B 组成的数据?
我只想出以下办法:
从 A 调用 databaseClient.select,然后在循环中从 B 调用 select。
但我想要更高效和反应性更强的方式。怎么做?
TL;DR: 使用 SQL.
Spring Data 的 DatabaseClient
是 JdbcTemplate
对 JDBC 的 R2DBC 的改进和反应变体。它封装了各种执行模式、资源管理和异常翻译。其流畅的APIselect/insert/update/delete方法适用于简单扁平的查询。超出所提供 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 问题。
在 java 反应器中,r2dbc。我有两个表 A、B。我还为它们定义了存储库。 如何获取由 A 加入 B 组成的数据?
我只想出以下办法: 从 A 调用 databaseClient.select,然后在循环中从 B 调用 select。
但我想要更高效和反应性更强的方式。怎么做?
TL;DR: 使用 SQL.
Spring Data 的 DatabaseClient
是 JdbcTemplate
对 JDBC 的 R2DBC 的改进和反应变体。它封装了各种执行模式、资源管理和异常翻译。其流畅的APIselect/insert/update/delete方法适用于简单扁平的查询。超出所提供 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 问题。