JOOQ Литая строка в Enum с конвертером - PullRequest
1 голос
/ 24 октября 2019

При поиске способа приведения моего поля String в Enum я наткнулся на метод .cast(). При вызове выбрасывается SQLDialectNotSupportedException.
Диалект был установлен на SQLSERVER2014 в контексте DSLContext create = DSL.using(conn, SQLDialect.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() или есть другой способполучить строку в Enum я не могу найти?

1 Ответ

1 голос
/ 24 октября 2019

Вы не можете использовать 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)...

Но я действительно рекомендую прикрепитьконвертер в сгенерированный код для наибольшего удобства.

...