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

Mapping from java.time.MonthDay to java.sql.*

我们有一个案例,我们只需要日期和月份,因此会使用 java.time.MonthDay (Javadocs) 来表示该信息。

我们知道我们可以创建自己的 JPA 对象以实现持久性或只使用 java.sql.Date 对象,但这通常需要不需要的年份信息。 另一种方法是调用方法.atYear(int)(Javadoc) (with a fictitious year) on it and receive a java.time.LocalDate (Javadoc),可以很容易地转换为java.sql.Date。但是这样以后容易产生误会(还要持久化年份信息)。

对于这种情况是否有一些 "elegant"/假设的解决方案?或者是否有 SQL 的替代品支持持久性的全新日期和时间 API。

另一种情况是 java.time.YearMonth (Javadoc).

感谢阅读!

因为 SQL 数据库没有与 MonthDay, use a VARCHAR columns, and simply use toString() and MonthDay.parse() 兼容的类型。

如果您不喜欢 --12-03 格式,也可以使用自定义 DateTimeFormatter

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

这里是代码片段:

// 列定义:

@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);
    }
}