【问题标题】:JOOQ Cast String to Enum with ConverterJOOQ 使用转换器将字符串转换为枚举
【发布时间】:2020-02-20 15:19:01
【问题描述】:

在寻找将我的字符串字段转换为枚举的方法时,我发现了.cast() 方法。调用时会抛出 SQLDialectNotSupportedException
在上下文DSLContext create = DSL.using(conn, SQLDialect.SQLSERVER2014); 中,方言已设置为SQLSERVER2014
对应行:

create.select( ... lecture.DAY_OF_WEEK.cast(DayOfWeek.class), ... );  

完整的错误:

org.jooq.exception.SQLDialectNotSupportedException: Type class java.time.DayOfWeek is not supported in dialect null
at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:944)
at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:880)
at org.jooq.impl.AbstractField.cast(AbstractField.java:256)
at de.esteam.lecturedb.jooq.Classes.Startup.getStandardExample(Startup.java:218)
at de.esteam.lecturedb.jooq.Classes.Startup.main(Startup.java:54)

我尝试使用转换器实现到 Enum 的转换,但无法运行。

有没有办法让转换器进入cast(),或者有没有另一种方法可以让我找不到我的枚举?

【问题讨论】:

    标签: java sql-server enums jooq


    【解决方案1】:

    您不能在此处使用cast(),因为这需要 jOOQ 了解如何将您的数据类型转换为 SQL 中的自定义类型。您想要做的是客户端转换,理想情况下使用Converter 来实现。

    实现Converter 后,推荐的使用方法是使用代码生成器将其附加到生成的代码中: https://www.jooq.org/doc/latest/manual/code-generation/custom-data-types

    <forcedType>
      <userType>java.time.DayOfWeek</userType>
      <converter>com.example.YourConverter</converter>
      <includeExpression>(?i:DAY_OF_WEEK)</includeExpression>
    </forcedType>
    

    如果这不是一个选项,您可以创建一个“转换”字段引用,如下所示:

    // I'm assuming you're storing the data as an INTEGER
    DataType<DayOfWeek> type = SQLDataType.INTEGER.asConvertedDataType(new YourConverter());
    Field<DayOfWeek> field = DSL.field("{0}", type, lecture.DAY_OF_WEEK);
    
    // And now use that instead
    create.select(field)...
    

    但我真的建议将转换器附加到生成的代码中以获得最方便。

    【讨论】:

    • 谢谢,这正是我想要的。但我不能使用第一种方法(现在),所以它必须是第二种方法。我创建了转换器 public class DOWConverter extends EnumConverter&lt;Integer, DayOfWeek&gt; { public DOWConverter() { super(Integer.class, DayOfWeek.class); } } 但我收到了错误:No closing instance of type QueryFeaturesTask is accessible 上的 new DOWConverter() 来自您的建议
    • @recklessGreed:你能问一个新问题吗?注释部分对于代码和调试代码不是很好...
    • 当然!先感谢您。 stackoverflow.com/questions/58586868/…
    猜你喜欢
    • 2020-02-23
    • 2010-10-03
    • 1970-01-01
    • 2012-08-25
    • 2014-03-18
    • 2015-06-10
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多