如何将jodatime
YearMonth
对象持久保存到SQL数据库?
@Entity
public class MyEntity {
private YearMonth date; //how to persist?
//some more properties
}
我希望以后能够在特定月份之前选择所有实体。
答案 0 :(得分:2)
更好的问题是您打算如何使用数据库中的数据?通常,您希望使用目标数据库支持的数据类型(而不是字符串或复合整数)将日期存储在数据库中。这将允许您使用内置的数据库日期/时间函数和验证,而不是需要在您的应用程序中实现该逻辑。
您当然可以向您的实体添加方法,以便将jodatime值转换为您的实体,以用于需要它的应用程序部分。
答案 1 :(得分:1)
你需要一个javax.persistence.Converter(参见How to convert java.util.Date to Java8 java.time.YearMonth):
@Entity
public class MyEntity {
@Convert(converter = YearMonthConverter.class)
private YearMonth date; //how to persist?
//some more properties
}
以下是Java8 java.time.YearMonth到java.utilDate的示例转换器。您需要将java.time.YearMonth更改为org.joda.time.YearMonth并使用适当的方法转换为/或从所需类型转换: (省略导入):
@Converter(autoApply = true)
public class YearMonthConverter implements AttributeConverter<YearMonth, Date> {
@Override
public Date convertToDatabaseColumn(YearMonth attribute) {
// uses default zone since in the end only dates are needed
return attribute == null ? null : Date.from(attribute.atDay(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
}
@Override
public YearMonth convertToEntityAttribute(Date dbData) {
// TODO: check if Date -> YearMonth can't be done in a better way
if (dbData == null) return null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(dbData);
return YearMonth.of(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1);
}
}