Как конвертировать MySQL TINYBLOB в LocalDateTime? - PullRequest
1 голос
/ 22 марта 2020

JPA и MySQL преобразуют:

@Column(name = "registration_date")
private LocalDateTime registrationDate;

в тип столбца TINYBLOB.

Теперь база данных MySQL полна дат в TINYBLOB.

Как правильно решить эту проблему в новом Spring Boot v2.2.5?

Должны ли все столбцы TINYBLOB каким-либо образом быть преобразованы в любой другой тип даты непосредственно в MySQL db ? Следует ли использовать интерфейс AttributeConverter для преобразования при получении даты из БД?

@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Object> {

   @Override
   public Object convertToDatabaseColumn(LocalDateTime locDateTime) {
       return locDateTime == null ? null : Timestamp.valueOf(locDateTime);
   }

   @Override
   public LocalDateTime convertToEntityAttribute(Object tinyBlob) {
       if (sqlTimestamp != null) {
           // somehow convert tinyblob to LocalDateTime?
       }
       return null;
   }
}

1 Ответ

0 голосов
/ 22 марта 2020

Вот решение. Этот парень помог мне: { ссылка }

import java.time.LocalDateTime;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Object> {

@Override
public Object convertToDatabaseColumn(LocalDateTime locDateTime) {
    return locDateTime == null ? null : Timestamp.valueOf(locDateTime);
}

@Override
public LocalDateTime convertToEntityAttribute(Object sqlTimestamp) {
    if (sqlTimestamp != null) {
        try {
            byte[] dbBytes = (byte[]) sqlTimestamp;
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(dbBytes));
            LocalDateTime covertedDateFromBytes = (LocalDateTime) ois.readObject();
            ois.close();
            return covertedDateFromBytes;
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
    }
    return null;
}

Имейте в виду, что:

@Override
public Object convertToDatabaseColumn(LocalDateTime locDateTime) {
    return locDateTime == null ? null : Timestamp.valueOf(locDateTime);
}

сохраняет дату по-новому (как метка времени), так решите, хотите ли вы go с использованием крошечного шарика или использовать новый подход с отметкой времени.

...