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

column type conversion when using RDMS and Ignite Integration

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

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

比如我想把字符串类型为db的BIRTH_DAY列改成POJO中对应的java.sqlDate字段

请问这个怎么办?我可以在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"));

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

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 中获取它作为细绳)。为此,您应该在配置中手动更改映射:

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

对于字符串 -> 日期,这可能无法开箱即用,因为驱动程序和 JdbcTypesTransformer 不知道日期是如何在字符串中编码的。