如何在r2dbc中连接表?

19

在Java Reactor和r2dbc中,我有A表和B表,并定义了它们的Repository。如何获取A表和B表的联接数据?

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

但我想要更高效和响应式的方式。该怎么做?

1个回答

21

TL;DR: 使用 SQL。

Spring Data 的 DatabaseClient 是 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问题。


你的方法存在问题,即无法将结果映射到实体上。因此,让我们以查询人员和地址的示例为例,我不知道如何将选择的结果映射到任意实体PersonalInfo(除了map())。 - voipp
6
首先声明,Spring Data R2DBC 不是一个对象关系映射器。你可以将单行映射到单个对象。通过 execute(…).as(PersonalInfo.class).fetch().all() ,你可以使用基于约定的映射来处理所有结果。 - mp911de
1
这个 execute(…).as(PersonalInfo.class) 还有效吗?我找不到了。 - RamPrakash
@RamPrakash 请阅读以下内容:https://docs.spring.io/spring-data/r2dbc/docs/3.0.x/reference/html/#upgrading.1.1-1.2。基本上,`execute`方法已被`sql`方法所取代。 - fabiohbarbosa
@mp911de,你能否帮忙看一下我在r2dbc上的问题?链接在这里:https://stackoverflow.com/q/76755286/2886891。非常感谢! - Honza Zidek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接