Spring R2DBC DatabaseClient.as (…)

#java #spring #spring-boot #kotlin #spring-data-r2dbc

#java #весна #весенняя загрузка #kotlin #spring-data-r2dbc

Вопрос:

В моем приложении 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 устарело в пользу 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()
  

Являются ли эти расширения где-то еще или как я могу преобразовать, используя параметр уточненного типа?

Ответ №1:

TL; DR

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 реализациями, такими как SingleColumnRowMapper или DataClassRowMapper , которые были бы полезны и для Spring R2DBC.

Заключительные мысли

С точки зрения пользователя, as(…) существует большой спрос, и мы должны исследовать, как эта функциональность (или ее вариант) может быть реализована.

Комментарии:

1. Спасибо за понимание! Упоминание R2dbcEntityTemplate было полезным, я буду использовать его в тех случаях, когда репозитория недостаточно, например, для специализированных запросов объединения.

2. Черт возьми, я подал заявку в Spring Framework: github.com/spring-projects/spring-framework/issues/26021