使用RDMS和Ignite Integration时的列类型转换

时间:2016-12-21 10:42:18

标签: ignite

我正在使用RDMS和Ignite Integration https://apacheignite-mix.readme.io/v1.7/docs/automatic-persistence将每个表记录转换为POJO并将POJO放入Ignite Cache。

我想将POJO中相应字段的列类型更改为花药类型。

例如,我想将字符串类型为db的BIRTH_DAY列更改为相应的字段,即POJO中的java.sql Date。

我会问这个怎么样?我可以在CacheConfig代码端执行转换逻辑吗?

以下是在列名和POJO字段名之间进行映射的代码片段,但看起来我无法添加转换逻辑?

// Value fields for TBL_PERSON
Collection<JdbcTypeField> vals = new ArrayList<>();
vals.add(new JdbcTypeField(Types.INTEGER, "ID", int.class, "id"));
vals.add(new JdbcTypeField(Types.VARCHAR, "NMAE", String.class, "name"));
vals.add(new JdbcTypeField(Types.VARCHAR, "BIRTHDAY", String.class, "birthday"));

1 个答案:

答案 0 :(得分:1)

您可以尝试创建自定义JdbcTypesTransformer并通过factory设置它(请参阅:CacheJdbcPojoStoreFactory #setTransformer)。另请注意,您需要在所有节点上使用自定义转换器部署类。 代码可能是这样的:

public class MyJdbcTypesTransformer extends JdbcTypesDefaultTransformer {
/** */
private static final long serialVersionUID = 0L;

/** {@inheritDoc} */
@Override public Object getColumnValue(ResultSet rs, int colIdx, Class<?> type) throws SQLException {
    Object val = rs.getObject(colIdx);

    if (val instanceOf Strinng && type == Date.class) {
      .... conver from string to date....
    }

    return super.getColumnValue(rs, colIdx, type);
}

JdbcTypesDefaultTransformer(默认转换器)也会尝试使用底层JDBC头转换类型(例如,这意味着如果在DB中你有Integer,你可以尝试用Java作为String来获取它)。为此,您应该在config中手动更改映射:

vals.add(new JdbcTypeField(Types.INTEGER, "ID", String.class, "id"));

For String - &gt;日期可能无法开箱即用,因为驱动程序和JdbcTypesTransformer不知道日期是如何编码的。