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()
对象。
有什么方法可以解决这个问题吗?
问题源于你的呼唤
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