Перейти к основному содержимому

Преобразование между LocalDate и датой SQL

· 2 мин. чтения

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 .