java使用jOOQ更新Postgres日期范围
我试图更新一篇博士后daterange
。不管我怎么做都没用。现在我得到了
Error:(51, 17) java: reference to set is ambiguous both method set(org.jooq.Field,T) in org.jooq.UpdateSetStep and method set(org.jooq.Field,org.jooq.Field) in org.jooq.UpdateSetStep match
这是我的密码
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
# 1 楼答案
这是由于非常不幸的Java语言设计问题(我认为这是一个主要缺陷)documented in this question here。jOOQ本应该解决这个问题,但考虑到jOOQ早于Java 8,并且Java 8中引入了语言设计回归,现在jOOQ API中无法轻松地向后兼容地解决这个问题
有几种解决方法:
创建数据类型绑定
如果您计划更频繁地使用这个范围类型,那么这可能是最健壮的解决方案,在这种情况下,您应该定义一个custom data type binding。这是一个额外的工作,但一旦你指定了,你将能够写:
其中
AT_PREFERENCES.START_END
将是Field<MyRangeType>
强制转换为原始类型,并绑定一个未经检查的显式类型变量,该变量不是
Object
如果您只使用这种类型一次或两次,这是一个快速解决方法。它对运行时没有影响,只是让编译器相信这是正确的
转换为原始类型,然后返回到其他
Field<T>
type与之前相同,但这让类型推断可以为
<T>
推断<Void>
显式绑定到“错误”的API方法
在类型安全性中断和调用“错误”重载的罕见情况下,jOOQ在内部处理所有方法调用。所以,你也可以简单地称之为:
有了这个cast,只有
set(Field<T>, T)
方法是适用的,您不再依赖Java编译器在适用的重载(which no longer works since Java 8)中找到最具体的方法jOOQ将对
T
参数运行instanceof
检查,看看它是否真的是Field
类型,如果是这样,它会在内部重新路由到预期的API方法set(Field<T>, Field<T>)