java.time.LocalDateTime类型的属性在Hibernate

时间:2015-05-19 12:43:55

标签: java hibernate jpa java-8 jpql

我有一个JPA实体,其属性类型为java.time.LocalDateTime。我使用javax.persistence.Converter注释来实现此功能。我可以加载实体并保存它没有问题,但当我尝试执行这样的jpql查询时:

TypedQuery<Event> q = em.createQuery(
    "SELECT e " +
    "FROM Event e " +
    "WHERE :currentDateTime >= e.startDateTime", Event.class);
q.setParameter("currentDateTime", LocalDateTime.now().withSecond(0).withNano(0));

我收到这样的错误:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bytea >= timestamp without time zone

我尝试过很多东西,但无法使参数正常工作。我甚至尝试使用java.util.Datejava.util.Calendar作为参数,但它也不起作用。

1 个答案:

答案 0 :(得分:1)

我在评论中看到您要查询时间戳记

q.setParameter("currentDateTime", new Date(), TemporalType.TIMESTAMP)

因此您的转换器必须是LocalDateTimeTimestamp

我已经使用Hibernate作为JPA提供程序来完成此操作,并且我的代码在AttributeConverter<LocalDateTime, Timestamp>

中是这样的
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime date) {
    if (date == null) {
        return null;
    } else {
        return Timestamp.valueOf(date);
    }
}

@Override
public LocalDateTime convertToEntityAttribute(Timestamp value) {
    if (value == null) {
        return null;
    } else {
        return value.toLocalDateTime();
    }
}