Не удается преобразовать '0000-00-00 00: 00: 00' в метку времени


Определение поля

 /** Date. */
  @Column(columnDefinition = "datetime")
  private Date date;

Сеттер

public void setDate(final Date date) {
    DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
      this.date = dfmt.parse(dfmt.format(date));
    } catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

Есть ли у кого-нибудь идея, как преобразовать "нулевую дату" в правильное значение ? Потому что у меня есть ошибка:

Cannot convert value '0000-00-00 00:00:00' from column 13 to TIMESTAMP

И даже если я установлю поле "default" и сеттер вот так:

/** Date. */
      @Column
      private Date date;


public void setDate(final Date date) {
      this.date = date;   
  }

У меня все еще будет та же проблема....

2 28

2 ответа:

Я собираюсь сделать дикую догадку здесь, что вы используете MySQL : -) он использует "нулевые даты" как специальный заполнитель - к сожалению, JDBC не может обрабатывать их по умолчанию.

Решение состоит в том, чтобы указать "zeroDateTimeBehavior=convertToNull" в качестве параметра для вашего соединения с MySQL (либо в URL источника данных, либо в качестве дополнительного свойства), например:

jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull

Это приведет к тому, что все такие значения будут возвращены в виде нулей.

Я не понимаю смысла в вашем коде, где вы форматируете, а затем снова анализируете дату. Это похоже на идентичную операцию. Может быть, вы могли бы уточнить?


Если вы хотите задать дату по умолчанию, вы можете сделать:

/** Jan 1, 1970 ; first moment in time in Java */
private static final Date NO_DATE = new Date(0L);

private Date date;

public void setDate(final Date date) {
     if (date == null) {
         this.date = NO_DATE;
     } else {
         this.date = date;
     }
}
Примечание: аннотации являются опциональными, здесь я их не добавлял.

В этом коде вы можете подставить то, что хотите, в условие и в значение по умолчанию.

Вы также можете добавить аналогичный сеттер, который будет принимать строку аргумент, и проверка для вашего специального " 00000..." значение. Это позволит задать в поле либо дату, либо строку.