JPA中的Java 8 Date Time api

时间:2014-09-14 15:58:18

标签: spring hibernate jpa java-8 spring-data-jpa

如何在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)]

我尝试了很多方法,但似乎没有一种方法可行,甚至可能吗?

3 个答案:

答案 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?元素?