org.jooq.exception.SQLDialectNotSupportedException:方言 DEFAULT 中不支持类型类 java.net.Inet6Address

Arm*_*and 5 java postgresql jooq

静态 DSL 函数似乎row()没有使用 DSLContext 中使用的方言。

我使用 postgres 和 jooq 来查询我的数据库。我有一个与 类型的 java 对象一起使用的 Binder InetAddress,我在应用程序的其他部分成功地使用了它。使用上下文 DSL (DSLContext) 时,方言已正确设置为 postgres。

但是,如果我尝试使用类中的静态函数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());
Run Code Online (Sandbox Code Playgroud)

前面的代码会导致以下异常:

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)
...
Run Code Online (Sandbox Code Playgroud)

问题的根源似乎是 DSL 中的这个函数:

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)
...
Run Code Online (Sandbox Code Playgroud)

RowN()除了使用 DSL 类之外,我找不到任何构造对象的方法。

有什么办法可以解决这个问题吗?

Luk*_*der 3

问题是由您致电

row(link.from().ip(), link.to().ip())
Run Code Online (Sandbox Code Playgroud)

由于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))
Run Code Online (Sandbox Code Playgroud)

对于您的情况,这可能应该是开箱即用的。我为此创建了一个功能请求: https: //github.com/jOOQ/jOOQ/issues/8517