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()
对象的方法。
有什么办法解决这个问题?
答案 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