首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在属性级别强制执行MyBatis PSQL自定义TypeHandler

如何在属性级别强制执行MyBatis PSQL自定义TypeHandler
EN

Stack Overflow用户
提问于 2020-12-31 09:12:17
回答 1查看 226关注 0票数 0

我使用的是包含Set<UUID>Set<String>的DTO。

代码语言:javascript
复制
    public class MyBatisDTO implements Serializable{
    
    // other attributes
    
        private Set<UUID> uuidSet;
    
        private Set<String> stringSet;
    
      .....
}

typeHandler已经注册为泛型类型Set<T>.

代码语言:javascript
复制
@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.javauuidSet列和stringset列都存储为jsonb值的DB值映射时,typeHandler选择泛型类型作为String -> T extends String for Set<UUID> uuidSet;,这将导致自动将uuidSet的所有项转换为String。这不是一个错误,但是在调试中可以看到uuidSet包含String值。稍后,这也导致JAX-RS响应的反序列化,但这是目前不重要的另一个主题。

,我的问题是,是否有一种方法可以在属性级别上强制执行typeHandler?因此,我正在寻找一种解决方案,可以在属性级别上附加自定义TypeHandler,如下所示

代码语言:javascript
复制
//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,像这样吗?

代码语言:javascript
复制
@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);
.....
}
EN

回答 1

Stack Overflow用户

发布于 2020-12-31 22:24:29

您可以使用结果映射来完成这一任务:

代码语言:javascript
复制
@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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65518838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档