在Java Reactor和r2dbc中,我有A表和B表,并定义了它们的Repository。如何获取A表和B表的联接数据?
我只想到以下方法:从A表调用databaseClient.select,然后在循环中逐一从B表中调用select。
但我想要更高效和响应式的方式。该怎么做?
在Java Reactor和r2dbc中,我有A表和B表,并定义了它们的Repository。如何获取A表和B表的联接数据?
我只想到以下方法:从A表调用databaseClient.select,然后在循环中逐一从B表中调用select。
但我想要更高效和响应式的方式。该怎么做?
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问题。
execute(…).as(PersonalInfo.class).fetch().all()
,你可以使用基于约定的映射来处理所有结果。 - mp911deexecute(…).as(PersonalInfo.class)
还有效吗?我找不到了。 - RamPrakash