ормлит:Работа со значением по умолчанию «0000-00-00» для столбца даты в Mysql
Вопрос
Мне нужно использовать существующую базу данных, которую я не могу изменить, в которой используется это определение столбца:
"birthdate" date NOT NULL DEFAULT '0000-00-00'
Значение по умолчанию не является допустимой датой:
Исключение в потоке «основной» java.lang.RuntimeException:Невозможно преобразовать значение «0000-00-00» из столбца 29 в TIMESTAMP.
Есть ли способ вернуть null
из ormlite, если значение по умолчанию '0000-00-00'
найден?
Решение
Единственный способ сделать это — использовать собственный персистёр.Затем вы можете контролировать, как ОРМлайт хранит и извлекает данные из базы данных.Эта функция [к сожалению] недостаточно документирована.
Вы указываете класс следующим образом:
@DatabaseField(persisterClass = MyDatePersister.class)
Date birthDate;
Тогда ваш класс персистентности может выглядеть так:
public class MyDatePersister extends com.j256.ormlite.field.types.BaseDataType {
private static final MyDatePersister singleTon = new MyDatePersister();
@SuppressWarnings("deprecation")
private static final Timestamp ZERO_TIMESTAMP = new Timestamp(0, 0, 0, 0, 0, 0, 0);
private MyDatePersister() {
super(SqlType.DATE, new Class<?>[] { Date.class });
}
public static MyDatePersister getSingleton() {
return singleTon;
}
@Override
public Object resultToSqlArg(FieldType fieldType, DatabaseResults results,
int columnPos) throws SQLException {
Timestamp timestamp = results.getTimestamp(columnPos);
if (timestamp == null || ZERO_TIMESTAMP.equals(timestamp)) {
return null;
} else {
return timestamp;
}
}
}
Источник датытипа В сети.Надеюсь это поможет.
Другие советы
Как насчет изменения даты вашего рождения с NOT NULL DEFAULT «0000-00-00», чтобы разрешить значения NULL, тогда вам не нужно обрабатывать «0000-00-00», поскольку, судя по вашей информации, дата рождения может быть нулевой.
Есть еще один способ сделать это.Для строки подключения JDBC добавьте следующее: ZeroDateTimeBehavior = ConvertToNull.
Итак, после добавления этого в строку подключения это будет выглядеть следующим образом:jdbc:mysql://:/?zeroDateTimeBehavior=convertToNull
хз,
Нарендра