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

问题描述 投票:2回答:1

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

我正在使用带有jooq的postgres来查询我的数据库。我有一个Binder用于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()对象。

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

java postgresql jooq
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.