1. 概要

このクイックチュートリアルでは、java.time.LocalDateとjava.sql.Dateの間で変換する方法を学習します。

2. 直接変換

LocalDateからjava.sql.Dateに変換するには、 java.sql.Date。で使用可能なvalueOf()メソッドを使用できます。同様に、現在の日付を変換するには、使用する:

Date date = Date.valueOf(LocalDate.now());

または、その他の特定の日付:

Date date = Date.valueOf(LocalDate.of(2019, 01, 10));

さらに、 null 引数の場合、 valueOf()NullPointerExceptionをスローします。

それでは、 java.sql.DateからLocalDateに変換してみましょう。 そのために、 toLocalDate()メソッドを使用できます。

LocalDate localDate = Date.valueOf("2019-01-10").toLocalDate();

3. AttributeConverterの使用

まず、問題を理解しましょう。

Java 8には、 Date / TimeAPIを含む多くの便利な機能があります。

ただし、一部のデータベースまたは永続性フレームワークで使用するには、予想よりも少し多くの作業が必要です。 たとえば、JPAはLocalDateプロパティをjava.sql.Dateオブジェクトではなくblobにマップします。 その結果、データベースはLocalDateプロパティをDateタイプとして認識しません。

一般に、LocalDateDateの間で明示的な変換を実行する必要はありません。

たとえば、LocalDateフィールドを持つエンティティオブジェクトがあるとします。 このエンティティを永続化する場合、永続化コンテキストにLocalDateをjava.sql.Date。にマップする方法を指示する必要があります。

AttributeConverter クラスを作成して、簡単なソリューションを適用してみましょう。

@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        return Optional.ofNullable(localDate)
          .map(Date::valueOf)
          .orElse(null);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        return Optional.ofNullable(date)
          .map(Date::toLocalDate)
          .orElse(null);
    }
}

ご覧のとおり、 AttributeConverter インターフェイスは、LocalDateDateの2つのタイプを受け入れます。

つまり、 convertToDatabaseColumn()および convertToEntityAttribute()メソッドが変換プロセスを処理します。 実装内では、オプションを使用して、可能なnull参照を簡単に処理します。

さらに、@Converterアノテーションも使用しています。 autoApply = trueプロパティを使用すると、コンバーターはエンティティのタイプのすべてのマップされた属性に適用されます。

4. 結論

このクイックチュートリアルでは、 java.time.LocalDatejava.sql.Date。の間で変換する2つの方法を示しました。さらに、直接変換とカスタムを使用した例を示しました。 ]AttributeConverterクラス。

いつものように、この記事の完全なコードは、GitHubから入手できます。