1. Обзор
В этом кратком руководстве мы узнаем , как преобразовать java.time.LocalDate
в java.sql.Date
.
2. Прямое преобразование
Чтобы преобразовать LocalDate
в java.sql.Date
, мы можем просто использовать метод valueOf()
, доступный в java.sql.Date .
Аналогично, чтобы преобразовать текущую дату, мы можем использовать:
Date date = Date.valueOf(LocalDate.now());
Или любая другая конкретная дата:
Date date = Date.valueOf(LocalDate.of(2019, 01, 10));
Более того, valueOf()
генерирует исключение NullPointerException
в случае нулевого
аргумента.
Теперь давайте перейдем от java.sql.Date
к LocalDate
. Для этого мы можем использовать метод toLocalDate()
:
LocalDate localDate = Date.valueOf("2019-01-10").toLocalDate();
3. Использование преобразователя атрибутов
Во-первых, давайте поймем проблему.
Java 8 имеет множество полезных функций, в том числе Date/Time API .
Однако для его использования с некоторыми базами данных или средами сохраняемости требуется немного больше работы, чем ожидалось. Например, JPA сопоставит свойство LocalDate с большим двоичным объектом вместо объекта
java.sql.Date
. В результате база данных не распознает свойство LocalDate
как тип даты
.
Как правило, мы не хотим выполнять явное преобразование между LocalDate
и Date
.
Например, предположим, что у нас есть объект сущности с полем 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
принимает два типа: LocalDate
и Date
в нашем случае.
Короче говоря, методы convertToDatabaseColumn()
и convertToEntityAttribute()
позаботятся о процессе преобразования. Внутри реализации мы используем Optional
для простой обработки возможных нулевых
ссылок.
Кроме того, мы также используем аннотацию @Converter
. Со свойством autoApply=true
преобразователь будет применяться ко всем сопоставленным атрибутам типа объекта.
4. Вывод
В этом кратком руководстве мы показали два способа преобразования между java.time.LocalDate
и java.sql.Date.
Кроме того, мы представили примеры с использованием прямого преобразования и использования пользовательского класса AttributeConverter .
Как обычно, полный код для этой статьи доступен на GitHub .