Правильный способ преобразования отрицательного объекта JOOQ YearToSecond в миллисекунды

#java #postgresql #jooq

#java #postgresql #jooq

Вопрос:

При загрузке отрицательного Interval значения из базы данных Postgresql и преобразовании его в миллисекунды его знак игнорируется, и я получаю положительное значение. Я конвертирую YearToSecond с doubleValue() помощью .

 @Test
void testYearToSecondNegativeInterval()
{
  assertThat(YearToSecond.valueOf(2).doubleValue()).isEqualTo(2);
  assertThat(YearToSecond.valueOf(-2).doubleValue()).isEqualTo(-2);

  YearToSecond minus9802 = YearToSecond.valueOf("-0-0  0 00:00:09.082000000");
  assertThat(minus9802.doubleValue()).isEqualTo(-9802);
}
  

Этот модульный тест завершается с ошибкой:

 org.opentest4j.AssertionFailedError: 
Expecting:
 <9082.0>
to be equal to:
 <-9802.0>
but was not.
  

Я получил String представление ( -0-0 0 00:00:09.082000000 ) из сеанса отладки.
При запросе отображается то же значение -00:00:09.082 , что и with intervalstyle = 'sql_standard' и PT-9.082S with intervalstyle = 'iso_8601' .

Ответ №1:

Возможным обходным путем является прямая выборка значения в виде миллисекунд:

 create.select(DSL.extract(TABLE.COLUMN, DatePart.EPOCH)
                 .mul(1000)
                 .cast(Integer.class))
      .from(COLUMN)
  

Но это означает дополнительную работу, потому что необходимо извлечь дополнительное поле по сравнению с преобразованием YearToSecond .