Как вставить Postgres "бесконечность" в поле Timestamp с помощью JOOQ?

У меня есть столбец, определенный следующим образом:

expiry timestamp(0) without time zone not null

С Postgres я могу выдавать SQL, например:

insert into my_table(expiry) values ('infinity')

Я копался в доку JOOQ, но не смог найти ни одного примера с этим. Могу ли я сделать это с JOOQ - и как бы это выглядело?

Кроме того, возможно ли использование UpdatableRecord? Есть ли какой-то бесконечный "флаг" экземпляра Timestamp Я могу использовать?

2 ответа

Решение

Хорошо, нашел способ сделать это напрямую.

MyRecord r = db.insertInto(
  MY_RECORD, 
  MY_RECORD.ID,
  MY_RECORD.CREATED,
  MY_RECORD.EXPIRY
).values(
  val(id),
  currentTimestamp(),
  val("infinity").cast(Timestamp.class)
).returning().fetchOne();

Но это больше похоже на обходной путь, чем на правильный способ сделать это. Приведение строки к timestamp мне кажется, немного округлым, поэтому я написал CustomField сделать его проще и проще:

public class TimestampLiteral extends CustomField<Timestamp> {
  public static final TimestampLiteral INFINITY = 
    new TimestampLiteral("'infinity'");
  public static final TimestampLiteral NEGATIVE_INFINITY = 
    new TimestampLiteral("'-infinity'");
  public static final TimestampLiteral TODAY = 
    new TimestampLiteral("'today'");

  private String literalValue;

  public TimestampLiteral(String literalValue){
    super("timestamp_literal", SQLDataType.TIMESTAMP);
    this.literalValue = literalValue;
  }

  @Override
  public void accept(Context<?> context){
    context.visit(delegate(context.configuration()));
  }

  private QueryPart delegate(Configuration configuration){
    switch( configuration.dialect().family() ){
      case POSTGRES:
        return DSL.field(literalValue);

      default:
        throw new UnsupportedOperationException(
          "Dialect not supported - rethink your life choices.");
    }
  }

}

Тогда запрос:

MyRecord r = db.insertInto(
  MY_RECORD, 
  MY_RECORD.ID,
  MY_RECORD.CREATED,
  MY_RECORD.EXPIRY
).values(
  val(id),
  TimestampLiteral.TODAY,
  TimestampLiteral.INFINITY
).returning().fetchOne();

Не знаю, обязательно ли это "правильный" способ сделать это, но на данный момент это работает.

Еще интересно услышать, есть ли способ сделать это с UpdatableRecord,

Я создаю java.sql.Timestamp прохождение org.postgresql.PGStatement.DATE_POSITIVE_INFINITY своему конструктору.

create.insertInto(
  MY_RECORD, 
  MY_RECORD.ID,
  MY_RECORD.CREATED,
  MY_RECORD.EXPIRY
).values(
  1,
  new Timestamp(System.currentTimeMillis()),
  new Timestamp(PGStatement.DATE_POSITIVE_INFINITY)
).execute();
Другие вопросы по тегам