从java.time.MonthDay到java.sql.*的映射



在这种情况下,我们只需要日期和月份,因此将使用java.time.MonthDay (Javadocs)来表示该信息。

我们知道,我们可以为持久化创建自己的JPA对象,或者只使用java.sql.Date对象,但这通常需要不需要的年份信息。另一种方法是调用.atYear(int) (Javadoc)方法(带有虚构的年份)并接收java.time.LocalDate (Javadoc),它可以很容易地转换为java.sql.Date。但这很容易在将来造成误解(也会保留年份信息)。

对于这种情况是否有一些"优雅"/假定的解决方案?或者是否有一个SQL的替代品,支持用于持久化的全新日期和时间API。

另一个例子是java.time.YearMonth (Javadoc)。

感谢阅读!

由于SQL数据库没有与MonthDay兼容的类型,所以使用VARCHAR列,并简单地使用toString()MonthDay.parse()

或者使用自定义的DateTimeFormatter,如果你不喜欢--12-03格式。

默认格式将正确排序,作为字符串。

代码片段如下:

//column define:

@Column(name = "date", columnDefinition = "mediumint", nullable = false)
@Convert(converter = MonthDayIntegerAttributeConverter.class)
protected MonthDay date;

//转换器定义:

public class MonthDayIntegerAttributeConverter implements AttributeConverter<MonthDay, Integer> {
    @Override
    public Integer convertToDatabaseColumn(MonthDay attribute) {
        return (attribute.getMonthValue() * 100) + attribute.getDayOfMonth();
    }
    @Override
    public MonthDay convertToEntityAttribute(Integer dbData) {
        int month = dbData / 100;
        int day = dbData % 100;
        return MonthDay.of(month, day);
    }
}

相关内容

  • 没有找到相关文章

最新更新