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)]
Я пробовал много способов, но кажется, что никто не работает, возможно ли это?
Ответы
Ответ 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'?