間違ったタイプ
LocalDateTime
ここでは間違ったタイプです。 Javadocで説明されているように、そのクラスは瞬間を表すことはできません。
そのクラスには、意図的にタイムゾーンやUTCからのオフセットの概念がありません。つまり、「2019年1月23日の正午」などの日付と時刻を表しますが、それが東京、パリ、またはモントリオールの正午であるかどうかはわかりません。たとえば、3つのまったく異なる瞬間です。数時間離れています。したがって、このタイプは、標準のSQLタイプTIMESTAMP WITHOUT TIME ZONE
に適しています。 –なし 、 with ではありません 。
詳細については、次を参照してください: InstantとLocalDateTimeの違いは何ですか?
右タイプ
標準SQLタイプの場合TIMESTAMP WITH TIME ZONE
、JavaタイプInstant
を使用する必要があります 、OffsetDateTime
、またはZonedDateTime
。これら3つのうち、JDBC4.2では2番目のOffsetDateTime
のみのサポートが必要です。 。
検索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Postgresから取得される値は常にUTCになります。 SQL標準ではこの動作が指定されていないため、データベースは異なります。 Postgresでは、タイプTIMESTAMP WITH TIME ZONE
のフィールドに送信された値 UTCに調整されます。取得される値はUTCです。
保管。
myPreparedStatement.setObject( … , odt ) ;
UTC(ゼロのオフセット)から特定の地域の人々が使用する実時間(タイムゾーン)に調整します。
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
私はJPAを使用せず、物事をシンプルに保つことを好みます。
しかし、この回答 によると 、JPA2.2はjava.timeをサポートします タイプ。
Hibernateはjava.timeもサポートします 。