2017-09-27 3 views
2

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); 

conversion-result

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(); 
+0

のJava 'LocalDate'オブジェクトには時間やタイムゾーンの情報が格納されていません([Javadoc](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html)]を参照してください)、他の何かが疑わしい。 –

+0

あなたのMySQLサーバーのタイムゾーンを確認するために以下を実行してください: 'SELECT @@ system_time_zone、NOW()、UTC_TIMESTAMP()' –

+0

@TimBiege leisen結果は 'UTC | 2017-09-27 11:28:51 | 2017-09-27 11:28:51'に記載されている。 – Phobos

答えて

0

LocalDateは何のタイムゾーンを持っていないので、あなたは、データベーススキーマに限りcolumn_dateをマッピングし、タイムゾーンの変換の問題を回避するために、長い間にLocalDateを変換するAttributeConverterを使用することができます。

import javax.persistence.Converter; 
import java.time.LocalDate; 
import javax.persistence.AttributeConverter; 
@Converter 
public class LocalDateToLong implements AttributeConverter<LocalDate, Long> { 

    @Override 
    public Long convertToDatabaseColumn(LocalDate date) { 
     if (date != null) { 
      long epochDay = date.toEpochDay(); 
      return epochDay; 
     } 
     return null; 
    } 

    @Override 
    public LocalDate convertToEntityAttribute(Long epochDay) { 
     // TODO Auto-generated method stub 
     if (epochDay != null) { 
      LocalDate date = LocalDate.ofEpochDay(epochDay); 
      return date; 
     } 
     return null; 
    } 

} 
関連する問題