IT

jooq TIMESTAMP(6) 지원

itgroup 2022. 11. 8. 21:45
반응형

jooq TIMESTAMP(6) 지원

TIMESTAMP(6) 타입의 컬럼이 있는 MariaDB 테이블에 밀리초의 정밀도로 타임스탬프를 삽입하기 위해 Java Juq 라이브러리를 사용하려고 합니다.예를 들어 코드 행은 다음과 같습니다.

eventRecord.setEventtimestamp(LocalDateTime.ofEpochSecond(Instant.parse("2021-05-18T16:47:31.862750Z").getEpochSecond() , Instant.parse("2021-05-18T16:47:31.862750Z").getNano(), ZoneOffset.UTC));

안타깝게도 MariaDB의 결과는 잘리고 밀리초도 삽입되지 않습니다.

2021-05-18 16:47:31.000000

테이블 구조는 다음과 같습니다.

MariaDB [plc_data]> DESCRIBE events;
+---------------------+--------------+------+-----+------------------+-------+
| Field               | Type         | Null | Key | Default          | Extra |
+---------------------+--------------+------+-----+------------------+-------+
| event_id            | bigint(20)   | NO   | PRI | NULL             |       |
| eventTimestamp      | timestamp(6) | YES  |     | NULL             |       |
| insertTimestamp     | timestamp(6) | YES  |     | utc_timestamp(6) |       |
| machineSerialNumber | int(11)      | NO   |     | NULL             |       |
| data_block          | longtext     | NO   |     | NULL             |       |
+---------------------+--------------+------+-----+------------------+-------+

또한 두 개의 타임스탬프 필드에 대해 생성된 코드:

    /**
     * The column <code>plc_data.events.eventTimestamp</code>. GMT
     */
    public final TableField<EventsRecord, Instant> EVENTTIMESTAMP = createField(DSL.name("eventTimestamp"), org.jooq.impl.SQLDataType.LOCALDATETIME.defaultValue(org.jooq.impl.DSL.field("NULL", org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "GMT", new TimestampConverter());

    /**
     * The column <code>plc_data.events.insertTimestamp</code>. GMT
     */
    public final TableField<EventsRecord, Instant> INSERTTIMESTAMP = createField(DSL.name("insertTimestamp"), org.jooq.impl.SQLDataType.LOCALDATETIME.defaultValue(org.jooq.impl.DSL.field("utc_timestamp(6)", org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "GMT", new TimestampConverter());

TimestampConverter생성된 코드에서 볼 수 있는 클래스는 커스텀 컨버터입니다.

 * Jooq converter to use Instant instead of SQL TIMESTAMP which is mapped
 * into LocalDateTime
 */
public class TimestampConverter implements Converter<LocalDateTime, Instant> {

    private static final long serialVersionUID = -2866811348870878385L;

    /**
     * Convert from {@code LocalDateTime} to {@code Instant}
     */
    @Override
    public Instant from(LocalDateTime databaseObject) {
        return databaseObject.atZone(ZoneOffset.UTC).toInstant();
    }

    /**
     * Convert from {@code Instant} to {@code Timestamp}
     */
    @Override
    public LocalDateTime to(Instant userObject) {
        return userObject.atZone(ZoneOffset.UTC).toLocalDateTime();
    }

    /**
     * Return the from Type Class (Database Type Class)
     */
    @Override
    public Class<LocalDateTime> fromType() {
        return LocalDateTime.class;
    }

    /**
     * Return the to Type Class (User type Class)
     */
    @Override
    public Class<Instant> toType() {
        return Instant.class;
    }
}

주크에게 내 데이트의 밀리초 부분을 삽입하도록 지시하는 방법은 무엇입니까?

안부 전해요,

s.

언급URL : https://stackoverflow.com/questions/68455732/jooq-timestamp6-support

반응형