如何在jpa中集成Java 8 Date Time api的最佳方法是什么?
我添加了转换器:
@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)]
我尝试了很多方法,但似乎没有一种方法可行,甚至可能吗?
答案 0 :(得分:7)
Hibernate有一个扩展库,我相信hibernate-java8
,它本身支持许多时间类型。
您应该在编写转换器之前使用它。
在hibernate 5.2
中你不需要这个额外的库,它是核心的一部分。
答案 1 :(得分:1)
要查询时态字段,您应该在时态字段中使用@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();
}
}
答案 2 :(得分:0)
您是否在位于&#39; class&#39;中的persistence.xml中添加了LocalDatePersistenceConverter和LocalDateTimePersistenceConverter?元素?