繁体   English   中英

用jOOQ更新Postgres日期范围

[英]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))

明确绑定到“错误的” API方法

在少数情况下,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM