您将需要实施AttributeConverter<EntityType, DatabaseType>
以转换您的日期。
以下博客Thorben Janssen的关于 Java的思考解释了如何将属性存储在列中或列中。LocalDate
DATE
LocalDateTime
TIMESTAMP
JPA 2.1在 Java 8之前发布,因此不支持新的日期和时间 API。java.sql.Date
如果你想使用新的类(以正确的方式) ,你需要自己定义转换java.sql.Timestamp
。这可以通过实现AttributeConverter<EntityType, DatabaseType>
接口并用@Converter(autoApply=true)
. 通过设置autoApply=true
,转换器将应用于 的所有属性,EntityType
并且不需要对实体进行任何更改。
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
属性的转换对开发者来说是透明的,并且该LocalDate
属性可以用作任何其他实体属性。例如,您可以将其用作查询参数。
LocalDate date = LocalDate.of(2015, 8, 11);
TypedQuery<MyEntity> query = this.em.createQuery("SELECT e FROM MyEntity e WHERE date BETWEEN :start AND :end", MyEntity.class);
query.setParameter("start", date.minusDays(2));
query.setParameter("end", date.plusDays(7));
MyEntity e = query.getSingleResult();