Spring R2DBC DatabaseClient.as(…)

Rüd*_*ulz 12 java spring kotlin spring-boot spring-data-r2dbc

在我的 spring-boot 2.3 应用程序中,我使用了一个简单的数据方法DatabaseClient

fun getCurrentTime(): Mono<LocalDateTime> =
    databaseClient
        .execute("SELECT NOW()")
        .asType<LocalDateTime>()
        .fetch()
        .first()
}
Run Code Online (Sandbox Code Playgroud)

使用 spring-boot 2.4(和 spring 5.3 和 spring-data-r2dbc 1.2),org.springframework.data.r2dbc.core.DatabaseClient不推荐使用 spring-data-r2dbc,取而代之的org.springframework.r2dbc.core.DatabaseClient是 spring-r2dbc - 它具有不同的 API。

调整它非常简单 - 除了 kotlin 扩展asType,它不是新的 DatabaseClientExtensions 的一部分。

fun getCurrentTime(): Mono<LocalDateTime> =
    databaseClient
        .sql("SELECT NOW()")
        .map { row: Row ->
            row.get(0, LocalDateTime::class.java)!!
        }
        .one()
Run Code Online (Sandbox Code Playgroud)

这些扩展是其他地方还是我如何使用具体化类型参数进行转换?

mp9*_*1de 9

TL; 博士

as(Class)迁移到 Spring R2DBC 后没有API。

一点背景

DatabaseClient在实验性的 Spring Data R2DBC 项目中开始了它的旅程,尝试了各种方法。其中一个评估了文本 SQL API 和对象映射 API 可以结合在一起的程度。DatabaseClient在 Spring Data 中暴露了各种 API 方法,例如select().from("table").as(targetType).

事实证明,此功能很有用,但也有一定的局限性,因为 API 进入实体甚至面向聚合的方向越多,实际 API 变得越复杂,并且在某些时候,简单对象映射和实体之间的边界(例如, 实体生命周期回调)模糊。

我们决定引入R2dbcEntityTemplate所有实体绑定操作的抽象,以支持最常见的用例。看看之前的 fluent API,所有需要临时 SQL 查询、聚合、函数调用等的用例仍然存在差距。

与此同时,该项目证明是有用的,我们已经确定了可以迁移到 Spring Framework 5.3 的核心支持类,因此 Spring Data R2DBC 1.2 可以基于 Spring R2DBC。

在迁移代码时,我们无法想出合适的方法。公平地说,DatabaseClient提供与 NamedParameterJdbcTemplate. Spring JDBC 明确附带了一些RowMapper实现,例如SingleColumnRowMapperDataClassRowMapper对 Spring R2DBC 也很有用。

最后的想法

从用户的角度来看,as(…)看到了很多需求,我们应该调查一下,这个功能(或它的一个变体)是如何出现的。