如何将 Joda Date 保存到 sql 数据库?

How to persist Joda Date to sql database?

如何将 jodatime YearMonth 对象保存到 sql 数据库?

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

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

为此你需要 javax.persistence.Converter(参见 ):

@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 并使用适当的方法将 to/from 转换为所需的类型: (省略进口):

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

更好的问题是您打算如何使用数据库中的数据?通常,您希望使用目标数据库支持的数据类型将日期存储在数据库中,而不是字符串或复合整数。这将允许您使用内置数据库 date/time 函数和验证,而不是需要在您的应用程序中实现该逻辑。

您当然可以向您的实体添加方法,以将 to/from jodatime 值转换为您的实体,供您的应用程序需要它的部分使用。