【问题标题】:How to subtract Instants and compare with a Duration in jOOQ如何减去瞬间并与 jOOQ 中的持续时间进行比较
【发布时间】:2020-01-17 16:54:57
【问题描述】:

我正在尝试使用 jOOQ for Postgres 编写此查询:

SELECT * FROM my_table t WHERE t.instant1 - t.instant2 > interval '1 days';

所以我写了这个:

Duration oneDay = Duration.ofDays(1);
using(configuration)
    .selectFrom(MY_TABLE)
    .where(MY_TABLE.INSTANT1.minus(MY_TABLE.INSTANT2).gt(oneDay))

但它没有编译,因为:

无法解析方法'lt(java.time.Duration)'

我尝试将oneDay 包装在val() 中,然后错误变为:

无法解析方法'lt(org.jooq.Param)'

我认为问题在于方法 minus 返回 Field<Instant> 而不是 Field<Duration>,但在 Postgres 中,当减去 2 TIMESTAMP WITH TIME ZONE 时,结果是 interval

按照这些思路,jOOQ 甚至允许我编写这个在运行时会失败的查询,因为类型不会对齐:

using(configuration)
    .selectFrom(MY_TABLE)
    .where(MY_TABLE.INSTANT1.minus(MY_TABLE.INSTANT2).gt(Instant.now()))

还有其他我可以使用的 jOOQ 方法吗?除了做类似的事情:

"{0} - {1} > interval '1 day'"

谢谢。

【问题讨论】:

    标签: postgresql jooq


    【解决方案1】:

    jOOQ 3.12 在区间和区间算术支持方面仍有一些限制。我能想到的最好的方法是改变你的表达方式:

    t.instant1 - t.instant2 > interval '1 days'
    

    等价

    t.instant1 > t.instant2 + interval '1 days'
    

    这在jOOQ中很容易表示:

    T.INSTANT1.gt(T.INSTANT2.plus(1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 2018-08-30
      • 2016-02-24
      • 2011-10-11
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多