Spring R2DBC DatabaseClient.as(…)

Spring R2DBC DatabaseClient.as(…)

在我的 spring-boot 2.3 应用程序中,我有一个使用 DatabaseClient:

的简单数据方法
fun getCurrentTime(): Mono<LocalDateTime> =
    databaseClient
        .execute("SELECT NOW()")
        .asType<LocalDateTime>()
        .fetch()
        .first()
}

使用 spring-boot 2.4(以及 spring 5.3 和 spring-data-r2dbc 1.2),org.springframework.data.r2dbc.core.DatabaseClient 来自 spring-data-r2dbc已弃用 spring-r2dbc 的 org.springframework.r2dbc.core.DatabaseClient - 它具有不同的 API.

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

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

这些扩展是否在其他地方,或者我如何使用具体化的类型参数进行转换?

TL;DR

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

一些背景知识

DatabaseClient 在实验性 Spring Data R2DBC 项目中开始了它的旅程,尝试了各种方法。其中一个评估了文本 SQL API 和 object-mapping API 可以放在一起的接近程度。 DatabaseClient in Spring 数据公开了各种 API 方法,例如 select().from("table").as(targetType).

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

我们决定引入 R2dbcEntityTemplate 作为所有 entity-bound 操作的抽象,以支持最常见的 use-cases。看看之前的流利API,对于所有需要ad-hoc SQL查询,聚合,函数调用等的use-cases仍然存在差距

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

我们在迁移代码时未能想出合适的方法。公平地说,DatabaseClient 提供与 NamedParameterJdbcTemplate 几乎相同的抽象级别(存储过程除外)。 Spring JDBC 清楚地附带了几个 RowMapper 实现,例如 SingleColumnRowMapperDataClassRowMapper,它们对 Spring R2DBC 也很有用。

最后的想法

从 user-perspective 中,as(…) 看到了很多需求,我们应该研究如何让这个功能(或其变体)浮出水面。