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 类之外,我找不到任何构造对象的方法。
有什么办法可以解决这个问题吗?
问题是由您致电
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
| 归档时间: |
|
| 查看次数: |
2359 次 |
| 最近记录: |