Convertendo entre Data Local e Data SQL

Convertendo entre Data Local e Data SQL

1. Visão geral

Neste tutorial rápido, aprenderemoshow to convert between java.time.LocalDate and java.sql.Date.

2. Conversão Direta

To convert from LocalDate to java.sql.Date, we can simply use the valueOf() method available in*java.sql.Date*. Da mesma forma, para converter a data atual, podemos usar:

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

Ou qualquer outra data específica:

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

Além disso,valueOf() lançaNullPointerException no caso de um argumentonull.

Agora, vamos converter dejava.sql.Date toLocalDate. Para isso, podemos usar o métodotoLocalDate():

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

3. Usando umAttributeConverter

Primeiro, vamos entender o problema.

Java 8 possui muitos recursos úteis, incluindo oDate/Time API.

No entanto, usá-lo com alguns bancos de dados ou estruturas de persistência requer um pouco mais de trabalho do que o esperado. Por exemplo, JPA mapeará a propriedadeLocalDate em um blob em vez do objetojava.sql.Date. Como resultado, o banco de dados não reconhecerá a propriedadeLocalDate como um tipoDate.

Em geral, não queremos realizar uma conversão explícita entreLocalDate eDate.

Por exemplo, suponha que temos um objeto de entidade com um campoLocalDate. Ao persistir esta entidade,we need to tell the persistence context how to map the LocalDate into the *java.sql.Date*.

Vamos aplicar uma solução simples criando uma classeAttributeConverter:

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

Como podemos ver, a interfaceAttributeConverter aceita dois tipos:LocalDateeDate em nosso caso.

Resumindo, os métodosconvertToDatabaseColumn()econvertToEntityAttribute()  cuidarão do processo de conversão. Dentro das implementações, usamosOptional para lidar facilmente com possíveis referências denull.

Além disso, também estamos usando a anotação@Converter. With the autoApply=true property, the converter will be applied to all mapped attributes of the entity’s type.

4. Conclusão

Neste tutorial rápido, mostramos duas maneiras de converter entrejava.time.LocalDateejava.sql.Date. Além disso, apresentamos exemplos usando conversão direta e usando uma classeAttributeConverter personalizada.

Como de costume, o código completo deste artigo está disponívelover on GitHub.