JOOQ 使用内联转换器将字符串转换为枚举

Posted

技术标签:

【中文标题】JOOQ 使用内联转换器将字符串转换为枚举【英文标题】:JOOQ Cast String to Enum with Converter inline 【发布时间】:2020-02-23 11:30:35 【问题描述】:

这里问这个#58538732的后续问题

按照 Lukas Eder 的建议,我写了一个 EnumConverter 来将 Integer 转换为 DayOfWeek

public class DOWConverter extends EnumConverter<Integer, DayOfWeek>  

    public DOWConverter()
    
        super(Integer.class, DayOfWeek.class);           
                   

select 现在看起来如下

DataType<DayOfWeek> typeDOW = SQLDataType.INTEGER.asConvertedDataType(new DOWConverter() /*ERROR*/);
Field<DayOfWeek> fieldDOW = DSL.field("0", typeDOW, lecture.DAY_OF_WEEK);

create.select( ..., fieldDOW, ...)...

带有错误消息:

线程“main”java.lang.Error 中的异常:未解决的编译问题: 无法访问 QueryFeaturesTask 类型的封闭实例。必须使用 QueryFeaturesTask 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 QueryFeaturesTask 的实例)。

如上所述,在 CodeGen 时间使用转换器目前不是一种选择。

【问题讨论】:

【参考方案1】:

您似乎将DOWConverter 放在另一个类中,从而创建了inner class。我建议您将转换器放在***,在它自己的文件中,使其成为***类。如果必须创建嵌套类,请通过将其设为静态来确保它不是内部类:

public class Enclosing 
    // Make this class here static:
    public static class DOWConverter extends EnumConverter<Integer, DayOfWeek> 
        public DOWConverter() 
            super(Integer.class, DayOfWeek.class);           
                       
    

Oracle's tutorial on nested classes explains this really well.

【讨论】:

以上是关于JOOQ 使用内联转换器将字符串转换为枚举的主要内容,如果未能解决你的问题,请参考以下文章

java如何将接收到的数字自动转换为枚举

c++字符串转换为枚举类型

C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)

在Angular 6模板语句中将字符串转换为Typescript枚举

将PB中的枚举型转化数值型

使用泛型和简单地将字符串值转换为枚举时将字符串值转换为枚举时的混淆