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
实现,例如 SingleColumnRowMapper
或 DataClassRowMapper
,它们对 Spring R2DBC 也很有用。
最后的想法
从 user-perspective 中,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
实现,例如 SingleColumnRowMapper
或 DataClassRowMapper
,它们对 Spring R2DBC 也很有用。
最后的想法
从 user-perspective 中,as(…)
看到了很多需求,我们应该研究如何让这个功能(或其变体)浮出水面。