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

时间:2019-04-11 12:20:30

标签: java postgresql jooq

row()的静态DSL功能似乎不使用DSLContext中使用的方言。

我正在将postgres与jooq一起使用来查询我的数据库。我有一个与InetAddress类型的Java对象一起使用的活页夹,我已经在我的应用程序的其他部分成功使用了。使用上下文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());

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

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);
}

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

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

1 个答案:

答案 0 :(得分:0)

问题出在您致电

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