JDBI:插入日期长(毫秒)

时间:2016-05-02 20:33:24

标签: java date jdbi

在我的应用程序中,我将日期存储为毫秒

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对象,如果它使事情变得更清洁。

1 个答案:

答案 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());