LocalDate
フィールド(例: '2017-09-27')をJPA CriteriaBuilder APIを使用してmySQL Date
カラムに保存すると結果が異なります( '2017- 09-26 ')。mySQLデータベースに保存するときにLocalDateが変更されないようにする方法
データベースのタイムゾーンがSELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
を使用してUTCに設定されていることを検証しました。結果は'00:00:00 'です。
GMT + 2のタイムゾーンを使用していますので、LocalDate
からDate
に変換すると、2時間が差し引かれ、要求された日付の1日前に日付が生成されますLocalDate
フィールドは、それが何時間情報を持っていないの結果00:00:00として扱われていると仮定。
は何?この状況でLocalDatesを保存するための最良の方法であることは、私がアドバイスを以下れるべきここでhttps://stackoverflow.com/a/29751575/3832047と明示的にすべてのLocalDateフィールドをUTCなどに設定してください。
私はコードでそれらを変換するときに何が起こるかを確認するテストを実行し、以下の結果を得た:ここ
Date convertedDate = Date.valueOf(localDate);
EDIT
は、私がデータを取得するために使用したコードの例です。奇数の日付の変更も同様に発生します。 2017-06-27
のデータを要求すると、2017-06-26
の結果が表示されます。
CriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(HorseAndTrailerRequest.class);
Root<HorseAndTrailerRequest> criteria = criteriaQuery.from(HorseAndTrailerRequest.class);
ParameterExpression<LocalDate> effectiveDateParameter = criteriaBuilder.parameter(LocalDate.class);
criteriaQuery.select(criteria)
.where(
criteriaBuilder.equal(criteria.get("effectiveDate"), effectiveDateParameter)
);
TypedQuery<HorseAndTrailerRequest> query = sessionFactory.getCurrentSession().createQuery(criteriaQuery);
query.setParameter(effectiveDateParameter, date);
return query.getResultList();
のJava 'LocalDate'オブジェクトには時間やタイムゾーンの情報が格納されていません([Javadoc](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html)]を参照してください)、他の何かが疑わしい。 –
あなたのMySQLサーバーのタイムゾーンを確認するために以下を実行してください: 'SELECT @@ system_time_zone、NOW()、UTC_TIMESTAMP()' –
@TimBiege leisen結果は 'UTC | 2017-09-27 11:28:51 | 2017-09-27 11:28:51'に記載されている。 – Phobos