Как вычесть Instants и сравнить с длительностью в jOOQ - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь написать этот запрос с помощью jOOQ для 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'"

Спасибо.

1 Ответ

1 голос
/ 17 января 2020

jOOQ 3.12 по-прежнему имеет несколько ограничений в отношении интервала и интервала арифметической поддержки c. Лучший подход, который я могу придумать здесь, это изменить выражение:

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

на эквивалент

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

, который легко представить в jOOQ:

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