![](/img/trans.png)
[英]jOOQ - How to update a jsonb column with an array in a Postgres table to avoid SQLDialectNotSupportedException
[英]Update a Postgres daterange with jOOQ
我尝试更新Postgres daterange
。 无论我尝试什么,都行不通。 目前我得到
错误:(51,17)Java:对set的引用在org.jooq.UpdateSetStep中的方法set(org.jooq.Field,T)和org中的方法set(org.jooq.Field,org.jooq.Field)中都是模棱两可的.jooq.UpdateSetStep匹配
这是我的代码
ctx.update(AT_PREFERENCS)
.set(AT_PREFERENCS.DIRECTION, preferences.direction)
.set(AT_PREFERENCS.START_END, (Field<Object>) DSL.field("daterange(?, ?)", Object.class, preferences.start, preferences.end))
.where(AT_PREFERENCS.USER.eq(userId))
.execute();
如何使用jOOQ更新daterange
范围?
这是由于在此问题中记录的非常不幸的Java语言设计问题(我认为这是一个重大缺陷)。 jOOQ应该已经解决了这个问题,但是鉴于jOOQ早于Java 8,并且Java 8中引入了语言设计回归功能,因此无法轻松地在jOOQ API中对其进行修复,并且目前尚不能向后兼容。
有几种解决方法:
如果您打算更频繁地使用此范围类型,这可能是最可靠的解决方案,在这种情况下,您应该定义一个自定义数据类型绑定 。 前面需要做一些额外的工作,但是一旦指定了这些内容,就可以编写:
.set(AT_PREFERENCES.START_END, new MyRangeType(preferences.start, preferences.end))
其中AT_PREFERENCES.START_END
将是Field<MyRangeType>
。
Object
的未经检查的显式类型变量 如果您只使用一次或两次此类型,这是一个快速的解决方法。 它对运行时没有影响,只是使编译器相信这是正确的。
.<Void>set(
(Field) AT_PREFERENCES.START_END,
(Field) DSL.field("daterange(?, ?)", Object.class, preferences.start, preferences.end))
Field<T>
类型 与之前相同,但是这使类型推断可以为<T>
推断<Void>
<T>
.set(
(Field<Void>) (Field) AT_PREFERENCES.START_END,
(Field<Void>) (Field) DSL.field("daterange(?, ?)", Object.class,
preferences.start, preferences.end))
在少数情况下,jOOQ内部处理所有方法调用,其中类型安全性中断并且调用了“错误”重载。 因此,您也可以简单地这样称呼:
.set(
AT_PREFERENCES.START_END,
(Object) DSL.field("daterange(?, ?)", Object.class,
preferences.start, preferences.end))
使用此强制转换,仅set(Field<T>, T)
方法适用,并且您不再依赖Java编译器在适用的重载中查找最特定的方法( 自Java 8开始不再有效 )。
jOOQ将在T
参数上运行instanceof
检查,以查看它是否确实是Field
类型,在这种情况下,它会在内部重新路由到预期的API方法set(Field<T>, Field<T>)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.