Невозможно преобразовать '0000-00-00 00:00:00' в TIMESTAMP - PullRequest
28 голосов
/ 01 сентября 2009

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

 /** 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

И даже если я установлю поле по умолчанию и установщик следующим образом:

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


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

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

Ответы [ 2 ]

67 голосов
/ 01 сентября 2009

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

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

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

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

3 голосов
/ 01 сентября 2009

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


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

/** 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;
     }
}

Примечание: аннотации опциональны, здесь я их не добавил.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...