org.jooq.exception.SQLDialectNotSupportedException: введите класс java.net.Inet6Address не поддерживается на диалекте ПО УМОЛЧАНИЮ

#java #postgresql #jooq

#java #postgresql #jooq

Вопрос:

Статические функции DSL для row() , похоже, не используют диалект, используемый в DSLContext .

Я использую postgres с jooq для запроса моей базы данных. У меня есть связующее для использования с объектами типа java InetAddress , которые я успешно использую в других частях моего приложения. Диалект правильно настроен на postgres при использовании контекстного DSL (DSLContext).

Однако, если я попытаюсь использовать статические функции из DSL класса, используется диалект ПО УМОЛЧАНИЮ, и мой связующий файл не используется.

В частности, мой проблемный запрос, о котором идет речь, выглядит следующим образом:

 final var existingLinkRecords = asSeq(create
    .selectFrom(l)
    .where(row(l.FROM_IP, l.TO_IP).in(links.map(link -> row(link.from().ip(), link.to().ip())).asJava()))
    .fetch());
  

Предыдущий код приводит к следующему исключению:

 org.jooq.exception.SQLDialectNotSupportedException: Type class java.net.Inet6Address is not supported in dialect DEFAULT
    at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:884)
    at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:823)
    at org.jooq.impl.DSL.getDataType(DSL.java:21760)
    at org.jooq.impl.DSL.val(DSL.java:19522)
    at org.jooq.impl.Tools.field(Tools.java:1209)
    at org.jooq.impl.DSL.row(DSL.java:20152)
...
  

Корень проблемы, по-видимому, заключается в этой функции из DSL:

 @Deprecated
@Support
public static <T> DataType<T> getDataType(Class<T> type) {
    return DefaultDataType.getDataType(SQLDialect.DEFAULT, type);
}
  

Я не смог найти никакого способа создания RowN() объектов, кроме использования класса DSL.

Есть ли какой-нибудь способ решить эту проблему?

Комментарии:

1. Это звучит ужасно похоже на github.com/jOOQ/jOOQ/issues/8197 , который был исправлен в jOOQ 3.11.10. Какую версию jOOQ вы используете?

2. спасибо @LukasEder за ваш ответ. я использую 3.11.7, но я только что попробовал его с 3.11.11 и столкнулся с той же проблемой. я думаю, проблема в том, что T значения, которые я передаю, DSL.row(T, T) являются no Fields или другими специфичными для jooq классами, но голыми типами Inet6Address, поэтому DSL.row(T, T) функция не может получить контекст. есть ли способ получить контекстно-зависимую версию DSL , которая может создавать Row объекты? или есть какой-либо другой способ сделать where (a, b) in (('x', 'y'), ('z', 'n')) , где x, y, z, n не Fields являются значениями? 🙂

3. Я вижу, вы правы. Однако вам все равно придется обновляться 🙂

4. подойдет 🙂 большое спасибо за вашу помощь!

Ответ №1:

Проблема возникает из-за вашего вызова

 row(link.from().ip(), link.to().ip())
  

Поскольку DSL.row() это статический метод, jOOQ 3.11 в настоящее время не может «угадать», какова соответствующая привязка типа данных для ваших пользовательских типов, отсюда и исключение.

В качестве обходного пути существуют различные способы привязки типа данных к вашему выражению строки. Поскольку вы уже прикрепили его к своим row(l.FROM_IP, l.TO_IP) столбцам, вы можете использовать их повторно, используя DSL.val(Object, Field)

 row(val(link.from().ip(), l.FROM_IP), val(link.to().ip(), l.TO_IP))
  

Вероятно, в вашем случае это должно работать из коробки. Я создал запрос функции для этого: https://github.com/jOOQ/jOOQ/issues/8517

Комментарии:

1. спасибо, этот метод работает и делает именно то, что я хотел!