从 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);
}
}
我们有一个案例,我们只需要日期和月份,因此会使用 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);
}
}