在我的应用程序中,我将日期存储为毫秒
public class Model {
private long date = System.currentTimeMillis();
public void setDate(long date) {
this.date = date;
}
public long getDate() {
return date;
}
}
我有一个JDBI数据访问对象,如下所示:
public interface ModelDAO {
@SqlBatch("REPLACE INTO model (date) VALUES (:date)")
@BatchChunkSize(1000)
void insertModels(@BindBean List<Model> models);
@SqlQuery("SELECT * FROM model ORDER BY date DESC")
List<Model> getModels();
}
然而,当我尝试插入时,我得到:
org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: java.sql.BatchUpdateException:数据截断:日期时间不正确 值'''1430262000000'列'日期'
有没有办法可以告诉JDBI如何转换它,而不需要像我所有的日期类似的下面的内容?
@BindingAnnotation(BindModel.ModelBindingFactor.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface BindModel {
public static class ModelBindingFactor implements BinderFactory {
public Binder build(Annotation annotation) {
return new Binder<BindModel, Model>() {
public void bind(SQLStatement q, BindModel bind, Model model) {
q.bind("date", new Timestamp(model.getDate()));
}
};
}
}
}
我愿意切换我的模型以使用DateTime对象,如果它使事情变得更清洁。
答案 0 :(得分:2)
如果您可以使用DateTime存储日期值,将会更容易,更清晰。你应该有一个argumentFactory来转换DateTime到sql日期。您可以使用以下内容。
public class DateTimeAsSqlDateArgument implements ArgumentFactory<DateTime> {
@Override
public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) {
return value != null && DateTime.class.isAssignableFrom(value.getClass());
}
@Override
public Argument build(Class<?> expectedType, final DateTime value, StatementContext ctx) {
return new Argument() {
@Override
public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
statement.setTimestamp(position, new Timestamp(value.getMillis()));
}
};
}
}
将此参数工厂注册到dbi。这就是你所需要的一切。只要看到DateTime对象,JDBI就会使用这个工厂。
dbi.registerArgumentFactory(new DateTimeAsSqlDateArgument());