春季 R2DBC DatabaseClient.asTL;DR一些背景知识

在我的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)中,spring-data-r2dbc 被弃用,取而代之的是 spring-r2dbc - 它具有不同的 API。org.springframework.data.r2dbc.core.DatabaseClientorg.springframework.r2dbc.core.DatabaseClient

适应这一点非常简单 - 除了kotlin扩展,它不是新的DatabaseClientExtensions的一部分。asType

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

这些扩展名是在其他地方,还是如何使用重新定义的类型参数进行转换?


答案 1

TL;DR

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

一些背景知识

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

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

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

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

在迁移代码时,我们无法提出正确的方法。公平地说,它提供了与 几乎相同的抽象级别(存储过程除外)。Spring JDBC显然附带了几种实现,例如或对Spring R2DBC也很有用。DatabaseClientNamedParameterJdbcTemplateRowMapperSingleColumnRowMapperDataClassRowMapper

最后的思考

从用户的角度来看,我们看到了很多需求,我们应该研究如何浮出水面,这个功能(或其变体)是如何浮出水面的。as(…)


答案 2

推荐