org.jooq.exception.SQLDialectNotSupportedException: тип класса java.net.Inet6Address не поддерживается в диалекте DEFAULT - PullRequest
2 голосов
/ 11 апреля 2019

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

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

Однако, если я пытаюсь использовать статические функции из класса DSL, используется диалект DEFAULT, а мой Binder не используется.

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

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 Ответ

0 голосов
/ 12 апреля 2019

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

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

...