0

我有一个具有以下属性的域对象,在提交表单时,只有完成日期从表单输入绑定,而 dateRaised 为空。除了验证错误之外没有错误。我尝试将 dateRaised 类型更改为 java.time.LocalDate 并且它工作正常。是否已支持绑定到 java.time.LocalDateTime?

@NotNull
@Column(name = "date_raised", nullable = false)
@DateTimeFormat(iso = ISO.DATE_TIME)
private java.time.LocalDateTime dateRaised;

@Column(name = "completion_date")
@DateTimeFormat(iso = ISO.DATE)
private java.time.LocalDate completionDate;
4

1 回答 1

0

您将需要实施AttributeConverter<EntityType, DatabaseType>以转换您的日期。

以下博客Thorben Janssen的关于 Java的思考解释了如何将属性存储在列中或列中。LocalDateDATELocalDateTimeTIMESTAMP

如何使用 JPA 持久化 LocalDate 和 LocalDateTime

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();
于 2016-01-19T17:53:33.983 回答