Как вставить 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();