Spring R2DBC的DatabaseClient.as(…)。

17

在我的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中的org.springframework.data.r2dbc.core.DatabaseClient已被弃用,改为使用spring-r2dbc中的org.springframework.r2dbc.core.DatabaseClient - 它具有不同的API。

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

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

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

1个回答

14

简述

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

背景

DatabaseClient在试验性的Spring Data R2DBC项目中开始了它的旅程,尝试各种方法。其中之一评估了如何将文本SQL API和对象映射API紧密结合起来。Spring Data中的DatabaseClient公开了各种API方法,例如select().from("table").as(targetType)

事实证明这个功能很有用,但限制了某些功能,因为API越进入实体甚至面向聚合的方向,实际API就越复杂,在某些情况下,简单的对象映射和实体(例如实体生命周期回调)之间的界限变得模糊。

我们决定引入R2dbcEntityTemplate作为所有实体绑定操作的抽象,支持大多数常见用例。在查看之前使用的流畅API时,仍存在所有需要临时SQL查询、聚合、函数调用等用例的空缺。

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

在迁移代码时,我们无法提出一个合适的方法。公平地说,DatabaseClient 提供了几乎与 NamedParameterJdbcTemplate 相同级别的抽象(除了存储过程)。Spring JDBC 显然随附有多个 RowMapper 实现,例如 SingleColumnRowMapperDataClassRowMapper,这对于 Spring R2DBC 也会很有用。

最后的想法

从用户角度来看,as(…) 得到了很高的需求,我们应该研究如何将这种功能(或其变体)表现出来。


谢谢您的见解!提到R2dbcEntityTemplate非常有帮助,我将在仓库不足的情况下使用它,例如用于专门的JOIN查询。 - Rüdiger Schulz
1
顺便说一句,我在Spring Framework中提交了一个工单:https://github.com/spring-projects/spring-framework/issues/26021 - mp911de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接