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 .