我们有一个案例,我们只需要日期和月份,因此会使用java.time.MonthDay
(Javadocs)来表示该信息。
我们知道我们可以为持久性创建我们自己的JPA对象,或者只使用java.sql.Date
对象,但这通常需要一个不需要的年份信息。
另一种方法是在方法上调用方法.atYear(int)
(Javadoc)(虚拟年份)并收到java.time.LocalDate
(Javadoc),可以轻松转换为{ {1}}。但这很容易在将来产生误解(并且还会保留年度信息)。
对于这种情况,是否有一些"优雅" /假设的解决方案?或者是SQL的替代品,它支持持久性的全新日期和时间API。
另一个案例是java.sql.Date
(Javadoc)。
感谢阅读!
答案 0 :(得分:2)
由于SQL数据库没有与MonthDay
兼容的类型,请使用VARCHAR
列,只需使用toString()
和MonthDay.parse()
。
如果您不喜欢--12-03
格式,请使用自定义DateTimeFormatter
。
默认格式将正确排序为字符串。
答案 1 :(得分:1)
下面是代码段:
//列定义:
@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);
}
}