Подтвердить что ты не робот

Java 8 Дата Время api в JPA

Каков наилучший способ интеграции Java 8 Date Time api в jpa?

Я добавил конвертеры:

@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        return Date.valueOf(localDate);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        return date.toLocalDate();
    }
}

и

@Converter(autoApply = true)
public class LocalDateTimePersistenceConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime entityValue) {
        return Timestamp.valueOf(entityValue);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp databaseValue) {
        return databaseValue.toLocalDateTime();
    }
}

Все кажется прекрасным, но как мне использовать JPQL для запросов? Я использую Spring JPARepository, и цель состоит в том, чтобы выбрать все сущности, где дата совпадает с датой, только разница в том, что она сохраняется в объекте как LocalDateTime.

Итак:

public class Entity  {

    private LocalDateTime dateTime;

    ...
}

и

@Query("select case when (count(e) > 0) then true else false end from Entity e where e.dateTime = :date")
public boolean check(@Param("date") LocalDate date);

При выполнении это просто дает мне исключение, которое является правильным.

Caused by: java.lang.IllegalArgumentException: Parameter value [2014-01-01] did not match expected type [java.time.LocalDateTime (n/a)]

Я пробовал много способов, но кажется, что никто не работает, возможно ли это?

4b9b3361

Ответ 1

Hibernate имеет библиотеку расширений, hibernate-java8 Я верю, что изначально поддерживает многие типы времени.

Вы должны использовать его перед записью преобразователей.

в hibernate 5.2 вам не понадобится эта дополнительная библиотека, она является частью ядра.

Ответ 2

Чтобы запросить временные поля, вы должны использовать @Temporal Anotation во временных полях, добавьте конвертеры в persistence.xml, а также убедитесь, что используете java.sql.Date, java.sql.Time или java.sql. Временная метка в конвертерах. (Иногда я импортировал из неправильного пакета)

например, работает для меня:

@Temporal(TemporalType.TIMESTAMP)
@Convert(converter = InstantPersistenceConverter.class)
private Instant StartInstant;
@Temporal(TemporalType.TIME)
@Convert(converter = LocalTimePersistenceConverter.class)
private LocalTime StartTime;

и мой Мгновенный конвертер:

@Converter(autoApply = true)
public class InstantPersistenceConverter implements   AttributeConverter <Instant,java.sql.Timestamp>{
@Override
public java.sql.Timestamp convertToDatabaseColumn(Instant entityValue) {
    return java.sql.Timestamp.from(entityValue);
}

@Override
public Instant convertToEntityAttribute(java.sql.Timestamp databaseValue) {
    return databaseValue.toInstant();
}

}

Ответ 3

Вы добавили LocalDatePersistenceConverter и LocalDateTimePersistenceConverter в файл persistence.xml, помещенный в элемент 'class'?