如何将Joda Date坚持到sql数据库?

时间:2015-01-08 15:08:33

标签: java sql jodatime

如何将jodatime YearMonth对象持久保存到SQL数据库?

@Entity
public class MyEntity {
    private YearMonth date; //how to persist?
    //some more properties
}

我希望以后能够在特定月份之前选择所有实体。

2 个答案:

答案 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);
  }
}