首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis自定义TypeHandler在放入<result>标记时未执行

MyBatis自定义TypeHandler在放入<result>标记时未执行
EN

Stack Overflow用户
提问于 2013-11-21 13:21:50
回答 2查看 22.4K关注 0票数 3

对于结果属性之一,我有一个带有自定义typeHandlertypeHandler

代码语言:javascript
复制
<resultMap id="foo" type="hashmap">
    ... 
    <result property="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" />
    ...
</resultMap>

无论我将处理程序附加到哪个属性(我的意思是,这是而不是CLOB特定的问题,也尝试过使用VARCHAR ),当我从数据库获取结果时,处理程序将不会被调用。

我已经在我的自定义处理程序的所有方法中设置了断点:

代码语言:javascript
复制
public class OracleClobTypeHandler implements TypeHandler<String> {

  @Override
  public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    log.debug("setParameter called");   <================ BREAKPOINT HERE
  }

  @Override
  public String getResult(ResultSet rs, String columnName)
        throws SQLException {
    log.debug("getResult 2 called");    <================ BREAKPOINT HERE
    return "";
  }

  @Override
  public String getResult(ResultSet rs, int columnIndex)
        throws SQLException {
    log.debug("getResult 2 called");    <================ BREAKPOINT HERE
    return "";
  }

  @Override
  public String getResult(CallableStatement cs, int columnIndex)
        throws SQLException {
    log.debug("getResult 3 called");    <================ BREAKPOINT HERE
    return "";
  }
}

显然,上面的任何方法都不会被执行。

我尝试过将<typeHandler javaType="java.lang.String" jdbcType="CLOB" handler="com.foo.bar.OracleClobTypeHandler"/>放在myBatis <configuration>中,但这也不起作用。

其他任何事情都没有,包括扩展TypeHandler<Object>等等。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-21 13:40:33

经过长时间的挖掘,我终于找到了答案。

这似乎是myBatis中的一个bug。

为了让处理程序为<result>元素工作,您必须显式地指定column属性,即使属性已经匹配了bean中的列名和字段名。

在我的例子中,看起来是这样的:

代码语言:javascript
复制
 <result property="SERVICES_XML" column="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" />

请注意,上述更改还将导致<configuration>标记中定义的处理程序工作,因此内联typeHandler可能不再是必要的--这就是我的情况。最后我得到了:

代码语言:javascript
复制
<configuration>
  <typeHandlers>
    <typeHandler javaType="java.lang.String" jdbcType="CLOB" handler="com.foo.bar.OracleClobTypeHandler"/>        
  </typeHandlers>
</configuration>

代码语言:javascript
复制
<result property="SERVICES_XML" column="SERVICES_XML" javaType="string" jdbcType="CLOB" />
票数 4
EN

Stack Overflow用户

发布于 2016-11-02 15:26:11

虽然这个问题已经存在了3年,但我敢打赌,这个问题与Oracle从结果元数据中检索到的Oracle‘uppercase’列名有关,而区分大小写的java对象属性名称通常都尊重camel大小写。

然后,除非在SQL查询中使用引用的别名,否则需要显式的列-属性映射。The question has been asked here。与最近的评论中所说的不同,我观察到了引用别名的顺序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20122157

复制
相关文章

相似问题

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