当前位置: 首页 > 知识库问答 >
问题:

R2DBC Postgres SQL枚举问题

郏稳
2023-03-14

作为学习r2DBC的一部分,我遇到了Enum转换面临的问题。我在这里使用PostgreSQL。当读取评级为PG-13和NC-17(任何带破折号的东西)的电影数据时,我面临问题。

下面是我的表模式

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

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

共有1个答案

连俊智
2023-03-14

如果您使用Spring Boot/Spring数据R2dbc将表映射到POJO,则可以跳过Postgres中的枚举定义,默认情况下,Spring数据R2dbc将在db端将枚举处理为varchar/char,并在java POJO中使用enum,请查看我的示例,以及架构sql脚本和映射的实体类。Spring Boot注册映射转换器以自动转换它们。

如果您想自己处理Enum类型,请检查此示例。

 类似资料:
  • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

  • 问题内容: 通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容: 注意:代码编译正常。我不明白的是为什么我们可以从变量访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于。 所以,如果它们确实是静态的,为什么我们可以从中访问它们呢?最后一行是我熟悉的方式。 问题答案: 写作 和写作一样。也就是说,编译器将用其编译时类型Animal替换变

  • 定义一个枚举,将其中一个取值作为replace方法的第二个参数,这时候会报错,该怎么处理?

  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 数字枚举 首先我们看看数字枚举,如果你使用过其它编程语言应该会很熟悉。 enum Direction { Up = 1, Down, Left, Right } 如上,我们定义了一个数字枚举,Up使用初始化为1。 其余的成员

  • 枚举 枚举为一组相关值定义了一个通用类型,从而可以让你在代码中类型安全地操作这些值。 如果你熟悉 C ,那么你可能知道 C 中的枚举会给一组整数值分配相关的名称。Swift 中的枚举则更加灵活,并且不需给枚举中的每一个成员都提供值。如果一个值(所谓“原始”值)要被提供给每一个枚举成员,那么这个值可以是字符串、字符、任意的整数值,或者是浮点类型。 而且,枚举成员可以指定任意类型的值来与不同的成员值关