有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    这是由于非常不幸的Java语言设计问题(我认为这是一个主要缺陷)documented in this question here。jOOQ本应该解决这个问题,但考虑到jOOQ早于Java 8,并且Java 8中引入了语言设计回归,现在jOOQ API中无法轻松地向后兼容地解决这个问题

    有几种解决方法:

    创建数据类型绑定

    如果您计划更频繁地使用这个范围类型,那么这可能是最健壮的解决方案,在这种情况下,您应该定义一个custom data type binding。这是一个额外的工作,但一旦你指定了,你将能够写:

    .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>type

    与之前相同,但这让类型推断可以为<T>推断<Void>

    .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))
    

    有了这个cast,只有set(Field<T>, T)方法是适用的,您不再依赖Java编译器在适用的重载(which no longer works since Java 8)中找到最具体的方法

    jOOQ将对T参数运行instanceof检查,看看它是否真的是Field类型,如果是这样,它会在内部重新路由到预期的API方法set(Field<T>, Field<T>)