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

Posted

技术标签:

【中文标题】JOOQ 使用转换器将字符串转换为枚举【英文标题】:JOOQ Cast String to Enum with Converter 【发布时间】: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(),或者有没有另一种方法可以让我找不到我的枚举?

【问题讨论】:

【参考方案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:你能问一个新问题吗?注释部分对于代码和调试代码不是很好... 当然!先感谢您。 ***.com/questions/58586868/…

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

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

将字符串转换为枚举? [复制]

如何使用 LinqToSql 将字符串值隐式转换为枚举?

java如何用方法toString()将枚举类型转换为字符串类型

Java将字符串转换为枚举列表[重复]

枚举使用编译时常量转换为字符串