ormlite:Lidando com um Valor padrão de "0000-00-00" para uma coluna de Data no Mysql
Pergunta
Eu tenho que usar um Banco de dados existente que eu não posso mudar que utiliza esta definição de coluna:
"birthdate" date NOT NULL DEFAULT '0000-00-00'
O valor padrão não é uma data válida:
Exception in thread "main" do java.lang.RuntimeException:Não é possível converter o valor de '0000-00-00' da coluna de 29 de CARIMBO de data / hora.
Existe uma maneira de voltar null
a partir de ormlite se o valor padrão '0000-00-00'
é encontrado?
Solução
A única maneira de fazer isso é com um personalizado persister.Em seguida, você pode controlar como ORMLite armazena e recupera dados a partir do banco de dados.Esse recurso é [infelizmente] não está bem documentada.
Especificar a classe assim:
@DatabaseField(persisterClass = MyDatePersister.class)
Date birthDate;
Em seguida, o seu persister classe pode parecer com:
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;
}
}
}
DateType de origem está on-line.Espero que isso ajude.
Outras dicas
Como mudar a sua data de nascimento a partir de um not NULL DEFAULT '0000-00-00' para permitir valores NULOS, em seguida, você não tem que lidar com o '0000-00-00', pois a partir de sua informação, a data de nascimento pode ser nulo.
Não há outra maneira de fazer isso.Para a Seqüência de conexão JDBC, adicione o seguinte: zeroDateTimeBehavior=convertToNull.
Então, depois de adicionar esta a seqüência de caracteres de conexão, ele vai parecer como a seguir:jdbc:mysql://:/?zeroDateTimeBehavior=convertToNull
hth,
Narendra