Рубрики
Без рубрики

Преобразование между датой локального и S’L

Узнайте, как преобразовать между Java.sql.Date и java.time.LocalDate

Автор оригинала: baeldung.

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() бросает NullPointerЭксцепция в случае нулевой аргумент.

Теперь, давайте конвертировать из Java.sql.Date Местное . Для этого мы можем использовать toLocalDate() метод:

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

3. Использование attributeConverter

Во-первых, давайте поймем проблему.

Java 8 имеет много полезных функций, в том числе Дата/время API .

Однако использование его с некоторыми базами данных или структурами настойчивости требует немного больше работы, чем ожидалось. Например, JPA будет карт- Местное свойство в каплю вместо Java.sql.Date объект. В результате база данных не распознает Местное собственности в качестве Дата тип.

Как правило, мы не хотим выполнять явное преобразование между Местное и Дата .

Например, предположим, что у нас есть объект сущности с Местное поле. Сохраняя эту сущность, мы должны рассказать контексту настойчивости, как составить карту Местное в Java.sql.Date .

Примените простое решение, создав класс AttributeConverter:

@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter {

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

Как видим, АтрибутКонвертер интерфейс принимает два типа: Местное и Дата в нашем случае.

Короче говоря, конвертироватьToDatabaseColumn() и конвертироватьToEntityAttribute() методы будут заботиться о процессе преобразования. Внутри реализаций мы используем Необязательный легко обрабатывать возможные нулевой Ссылки.

Кроме того, мы также используем @Converter аннотация. С autoApply-истинный свойство, преобразователь будет применяться ко всем отображаемым атрибутам типа сущности.

4. Заключение

В этом быстром учебнике мы показали два способа преобразования между java.time.LocalDate и Java.sql.Date. Кроме того, мы представили примеры, используя прямую конверсию и используя пользовательский АтрибутКонвертер класс.

Как обычно, полный код для этой статьи доступен более на GitHub .