我正在使用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"));
答案 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不知道日期是如何编码的。