如何解决如何在属性级别强制执行 MyBatis PSQL 自定义 TypeHandler
我正在使用包含 Set<UUID>
和 Set<String>
的 DTO。
public class MyBatisDTO implements Serializable{
// other attributes
private Set<UUID> uuidSet;
private Set<String> stringSet;
.....
}
已为泛型类型 Set<T>
注册了 typeHandler。
@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
值,typeHandler 选择泛型类型为 String -> T extends String
为 Set<UUID> uuidSet;
以及这导致自动类型转换为 uuidSet
作为字符串的所有项目。这不是错误,但在调试中可以看到 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-Level 上提及这些 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);
.....
}
解决方法
您可以使用结果地图来做到这一点:
@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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。