Java 如何修改我的`@SQLUpdate`,将一个`Joda``DateTime`对象转换成一个`h2`可读的时间戳?

Java 如何修改我的`@SQLUpdate`,将一个`Joda``DateTime`对象转换成一个`h2`可读的时间戳?,java,datetime,jodatime,h2,jdbi,Java,Datetime,Jodatime,H2,Jdbi,如何修改@SQLUpdate以将JodaDateTime对象转换为h2可读的时间戳 我有一个DAO对象,MyDao,带有一个insert方法 public interface MyDao extends Transactional<MyDao> { @SqlUpdate( "INSERT INTO my_table "(id, original_date, later_date)" + "VALUES (:id, :originalDate,

如何修改
@SQLUpdate
以将
Joda
DateTime
对象转换为
h2
可读的时间戳

我有一个DAO对象,
MyDao
,带有一个
insert
方法

public interface MyDao extends Transactional<MyDao> {
    @SqlUpdate(
        "INSERT INTO my_table "(id, original_date, later_date)" +
        "VALUES (:id, :originalDate, :laterDate)"
    void insert(@BindBean MyObject myObject);
}
migrations.xml
文件(我正在使用)中,我有:

我试图对此进行测试,但出现如下错误:

org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.h2.jdbc.JdbcSQLException: Cannot parse "TIMESTAMP" constant "aced0005737200166f72672e6a6f64612e74696d652e4461746554696d65b83c78646a5bddf90200007872001f6f72672e6a6f64612e74696d652e626173652e426173654461746554696d65fffff9e14f5d2ea30200024a0007694d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000014b030b30c0737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae3030000787077150013416d65726963612f4c6f735f416e67656c65737878"; SQL statement:

[SQL statement]

at org.h2.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:275)
at org.h2.value.ValueTimestamp.parseTry(ValueTimestamp.java:140)
at org.h2.value.ValueTimestamp.parse(ValueTimestamp.java:120)
at org.h2.value.Value.convertTo(Value.java:862)
at org.h2.table.Column.convert(Column.java:148)
at org.h2.command.dml.Insert.insertRows(Insert.java:143)
at org.h2.command.dml.Insert.update(Insert.java:114)
at org.h2.command.CommandContainer.update(CommandContainer.java:78)
at org.h2.command.Command.executeUpdate(Command.java:254)
at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:198)
at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
at org.skife.jdbi.v2.Update.execute(Update.java:56)
at org.skife.jdbi.v2.sqlobject.UpdateHandler$2.value(UpdateHandler.java:62)
at org.skife.jdbi.v2.sqlobject.UpdateHandler.invoke(UpdateHandler.java:75)
at org.skife.jdbi.v2.sqlobject.SqlObject.invoke(SqlObject.java:175)
at org.skife.jdbi.v2.sqlobject.SqlObject$1.intercept(SqlObject.java:75)
at org.skife.jdbi.v2.sqlobject.CloseInternalDoNotUseThisClass$$EnhancerByCGLIB$$4df23516.insert(<generated>)
org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException:org.h2.jdbc.JdbcSQLException:无法解析“TIMESTAMP”常量"7.0 0 0 577 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7E49534F436872F6E6F6C6F67792453747562A9C81166713750270300078707372001F6F72672E6A6F64612E74696D652E461746554696D65566D655A6F6E6524547562A62A62F019A7C321AE303000077077150013416D657269632F4C6F735F4676C65737878”;SQL语句:
[SQL语句]
位于org.h2.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:275)
位于org.h2.value.ValueTimestamp.parseTry(ValueTimestamp.java:140)
位于org.h2.value.ValueTimestamp.parse(ValueTimestamp.java:120)
位于org.h2.value.value.convertTo(value.java:862)
位于org.h2.table.Column.convert(Column.java:148)
位于org.h2.command.dml.Insert.insertRows(Insert.java:143)
位于org.h2.command.dml.Insert.update(Insert.java:114)
位于org.h2.command.CommandContainer.update(CommandContainer.java:78)
位于org.h2.command.command.executeUpdate(command.java:254)
在org.h2.jdbc.JdbcPreparedStatement.execute上(JdbcPreparedStatement.java:198)
位于org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
位于org.skife.jdbi.v2.Update.execute(Update.java:56)
位于org.skife.jdbi.v2.sqlobject.UpdateHandler$2.value(UpdateHandler.java:62)
位于org.skife.jdbi.v2.sqlobject.UpdateHandler.invoke(UpdateHandler.java:75)
位于org.skife.jdbi.v2.sqlobject.sqlobject.invoke(sqlobject.java:175)
位于org.skife.jdbi.v2.sqlobject.sqlobject$1.intercept(sqlobject.java:75)
在org.skife.jdbi.v2.sqlobject.CloseInternalDoNotUseThisClass$$EnhancerByGlib$$4df23516.insert()上

我们可以通过将参数工厂注册到DBI来实现这一点

public class DateTimeArgumentFactory 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 java.sql.Timestamp(value.getMillis()));
            }
        };
    }
}

这将自动将DateTime转换为sql时间戳。

尝试使用毫秒版本-
This.originalDate=new java.sql.Date(originalDate;.getmillis())
@Test
public void test() {
    DateTime dt = new DateTime(2015, 5, 29, 8, 34);
    UUID uuid = new UUID(5, 8);
    MyObject myObject = new MyObject(uuid, dt, dt);
    mydao.insert(myObject)
    // assertEquals and other code here
}
org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.h2.jdbc.JdbcSQLException: Cannot parse "TIMESTAMP" constant "aced0005737200166f72672e6a6f64612e74696d652e4461746554696d65b83c78646a5bddf90200007872001f6f72672e6a6f64612e74696d652e626173652e426173654461746554696d65fffff9e14f5d2ea30200024a0007694d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000014b030b30c0737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae3030000787077150013416d65726963612f4c6f735f416e67656c65737878"; SQL statement:

[SQL statement]

at org.h2.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:275)
at org.h2.value.ValueTimestamp.parseTry(ValueTimestamp.java:140)
at org.h2.value.ValueTimestamp.parse(ValueTimestamp.java:120)
at org.h2.value.Value.convertTo(Value.java:862)
at org.h2.table.Column.convert(Column.java:148)
at org.h2.command.dml.Insert.insertRows(Insert.java:143)
at org.h2.command.dml.Insert.update(Insert.java:114)
at org.h2.command.CommandContainer.update(CommandContainer.java:78)
at org.h2.command.Command.executeUpdate(Command.java:254)
at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:198)
at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
at org.skife.jdbi.v2.Update.execute(Update.java:56)
at org.skife.jdbi.v2.sqlobject.UpdateHandler$2.value(UpdateHandler.java:62)
at org.skife.jdbi.v2.sqlobject.UpdateHandler.invoke(UpdateHandler.java:75)
at org.skife.jdbi.v2.sqlobject.SqlObject.invoke(SqlObject.java:175)
at org.skife.jdbi.v2.sqlobject.SqlObject$1.intercept(SqlObject.java:75)
at org.skife.jdbi.v2.sqlobject.CloseInternalDoNotUseThisClass$$EnhancerByCGLIB$$4df23516.insert(<generated>)
public class DateTimeArgumentFactory 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 java.sql.Timestamp(value.getMillis()));
            }
        };
    }
}
  dbi.registerArgumentFactory(new DateTimeArgumentFactory());