【问题标题】:How to Enforce MyBatis PSQL custom TypeHandler on property level如何在属性级别强制执行 MyBatis PSQL 自定义 TypeHandler
【发布时间】:2021-04-07 15:48:02
【问题描述】:

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

    public class MyBatisDTO implements Serializable{
    
    // other attributes
    
        private Set<UUID> uuidSet;
    
        private Set<String> stringSet;
    
      .....
}

已经为 Generic-Type Set&lt;T&gt; 注册了一个 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 是从 DB 值映射时,uuidSetstringset 两列都存储为 jsonb 值,typeHandler 选择通用类型as String -> T extends String for Set&lt;UUID&gt; 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-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);
.....
}

【问题讨论】:

    标签: java postgresql jersey jax-rs mybatis


    【解决方案1】:

    您可以使用结果图来做到这一点:

    @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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2016-05-24
      • 1970-01-01
      相关资源
      最近更新 更多