ormlite:处理Mysql中Date列的默认值“0000-00-00”

时间:2012-02-29 15:23:00

标签: java mysql ormlite

我必须使用我无法更改的现有数据库使用此列定义:

"birthdate" date NOT NULL DEFAULT '0000-00-00'

默认值不是有效日期:

  

线程“main”中的异常java.lang.RuntimeException:无法将第29列的值'0000-00-00'转换为TIMESTAMP。

如果找到默认值null,有没有办法从ormlite返回'0000-00-00'

3 个答案:

答案 0 :(得分:1)

您可以使用自定义容器执行此操作的唯一方法。然后,您可以控制ORMLite如何存储和检索数据库中的数据。 [遗憾的是]这个功能没有很好的记录。

您可以像这样指定类:

@DatabaseField(persisterClass = MyDatePersister.class)
Date birthDate;

然后你的persister类看起来像:

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 source在线。希望这会有所帮助。

答案 1 :(得分:0)

如何将您的生日从NOT NULL DEFAULT'0000-00-00'更改为允许NULL值,那么您不必处理'0000-00-00',因为根据您的信息,出生日期可以为空。

答案 2 :(得分:0)

还有另一种方法可以做到这一点。对于JDBC连接,请添加以下字符串: zeroDateTimeBehavior = convertToNull

因此在将此添加到连接字符串后,它将如下所示:jdbc:mysql://:/?zeroDateTimeBehavior = convertToNull

HTH,
纳伦德拉