我使用的是包含Set<UUID>和Set<String>的DTO。
public class MyBatisDTO implements Serializable{
// other attributes
private Set<UUID> uuidSet;
private Set<String> stringSet;
.....
}typeHandler已经注册为泛型类型Set<T>.
@MappedJdbcTypes(JdbcType.OTHER)
@MappedTypes(Set.class)
public class SetTypeHandler extends BaseTypeHandler<Set<T>> {
@Override
public Set<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return mapFromJson(rs.getString(columnName));
}
.......现在的问题是,当上面提到的MyBatisDTO.java从uuidSet列和stringset列都存储为jsonb值的DB值映射时,typeHandler选择泛型类型作为String -> T extends String for Set<UUID> uuidSet;,这将导致自动将uuidSet的所有项转换为String。这不是一个错误,但是在调试中可以看到uuidSet包含String值。稍后,这也导致JAX-RS响应的反序列化,但这是目前不重要的另一个主题。
,我的问题是,是否有一种方法可以在属性级别上强制执行typeHandler?因此,我正在寻找一种解决方案,可以在属性级别上附加自定义TypeHandler,如下所示
//SUDO_CODE
public class MyBatisDTO implements Serializable{
// other attributes
@TypeHandler ("com.mybatis.handlers.typeHandler.SetUUIDTypeHandler")
private Set<UUID> uuidSet;
@TypeHandler ("com.mybatis.handlers.typeHandler.SetStringTypeHandler")
private Set<String> stringSet;
.....
}或者,如果有一种方法在Mapper级别上提到这些typeHandlers,像这样吗?
@Mapper
public interface MyBatisMapper {
//TYPE HANDLER ATTACHMENT/CONFIGURATION HERE ..???
@Select("SELECT uuidSet, stringSet FROM MyBatisDTO WHERE param = #{param}")
Cursor<MyBatisDTO> getData(@Param("param") final UUID param);
.....
}发布于 2020-12-31 22:24:29
您可以使用结果映射来完成这一任务:
@Mapper
public interface MyBatisMapper {
@Select("SELECT uuidSet, stringSet FROM MyBatisDTO WHERE param = #{param}")
@Results({
@Result(column = "uuidSet", property="uuidSet", typeHandler = "com.mybatis.handlers.typeHandler.SetUUIDTypeHandler"),
@Result(column = "stringSet", property="stringSet", typeHandler = "com.mybatis.handlers.typeHandler.SetStringTypeHandler")
})
Cursor<MyBatisDTO> getData(@Param("param") final UUID param);
}https://stackoverflow.com/questions/65518838
复制相似问题