【问题标题】:R2DBC Postgres SQL Enum IssueR2DBC Postgres SQL 枚举问题
【发布时间】:2022-01-21 06:21:51
【问题描述】:

作为学习 r2DBC 的一部分,我遇到了枚举转换所面临的问题。我在这里使用 PostgreSQL。 在读取评级为 PG-13 和 NC-17(带有破折号的任何内容) 的 Film 数据时,我遇到了问题。

下面是我的表格架构

create table film
(
film_id          integer       default nextval('film_film_id_seq'::regclass) not null
    constraint film_pkey
        primary key,
title            varchar(255)                                                not null,
description      text,
release_year     year,
language_id      smallint                                                    not null
    constraint film_language_id_fkey
        references language
        on update cascade on delete restrict,
rental_duration  smallint      default 3                                     not null,
rental_rate      numeric(4, 2) default 4.99                                  not null,
length           smallint,
replacement_cost numeric(5, 2) default 19.99                                 not null,
rating           mpaa_rating   default 'G'::mpaa_rating,
last_update      timestamp     default now()                                 not null,
special_features text[]
);

而 mpaa_rating 被定义为

create type mpaa_rating as enum ('G', 'PG', 'PG-13', 'R', 'NC-17');

这是在我的配置中注册转换器的代码

@Configuration
@EnableTransactionManagement
@EnableR2dbcRepositories
@EnableR2dbcAuditing
public class DVDRentalDBConfiguration extends AbstractR2dbcConfiguration {

@Bean
public ConnectionFactory connectionFactory() {
    System.out.println("Initializing postgreSQL connection factory");
    return new PostgresqlConnectionFactory(
            PostgresqlConnectionConfiguration.builder()
                    .host("localhost")
                    .database("dvdrental")
                    .username("postgres")
                    .password("postgres")
                    .codecRegistrar(EnumCodec.builder().withEnum("mpaa_rating", Rating.class).build())
                    .build()
    );
}

@Override
protected List<Object> getCustomConverters() {
    return Collections.singletonList(new RatingWritingConverter());
}

@Bean
ReactiveTransactionManager transactionManager(ConnectionFactory connectionFactory) {
    System.out.println("Initializing postgreSQL connection factory");
    return new R2dbcTransactionManager(connectionFactory);
}
}

我的检索代码非常简单

 private Mono<FilmModel> getFilmById(Long id) {
    return filmRepository.findById(id).switchIfEmpty(Mono.error(DataFormatException::new));
}
  

添加https://gist.github.com/harryalto/bd51bbcdd081868c5064c808d08205e4抛出的异常

我尝试研究堆栈溢出,但无法找出问题所在。非常感谢任何帮助。

【问题讨论】:

  • 添加例外会有所帮助。
  • 添加了异常

标签: spring-data-r2dbc r2dbc r2dbc-postgresql


【解决方案1】:

如果你使用 Spring Boot/Spring Data R2dbc 映射表到 POJO,你可以跳过 Postgres 中的 enum 定义,默认情况下 Spring Data R2dbc 在 db 端将 enum 处理为 varchar/char,在 java 中使用 Enum POJO,检查my exampleschema sql scriptmapped entity class。 Spring Boot 注册了映射转换器来自动转换它们。

如果您想自己处理 Enum 类型,请查看this example

【讨论】:

  • 我面临的问题与枚举的反向查找有关,这是实际问题。我已经查看了您共享的链接(感谢您提供详细信息和示例)。但我不认为这会解决我面临的问题。
  • 了解您的满意,您可以尝试创建自己的EnumCodec而不是内置的来解决此问题。
  • 我确实做到了,现在能够解决问题。谢谢@Hantsy
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 2020-09-14
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多