对于结果属性之一,我有一个带有自定义typeHandler的typeHandler:
<resultMap id="foo" type="hashmap">
...
<result property="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" />
...
</resultMap>无论我将处理程序附加到哪个属性(我的意思是,这是而不是CLOB特定的问题,也尝试过使用VARCHAR ),当我从数据库获取结果时,处理程序将不会被调用。
我已经在我的自定义处理程序的所有方法中设置了断点:
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>等等。
我做错了什么?
发布于 2013-11-21 13:40:33
经过长时间的挖掘,我终于找到了答案。
这似乎是myBatis中的一个bug。
为了让处理程序为<result>元素工作,您必须显式地指定column属性,即使属性已经匹配了bean中的列名和字段名。
在我的例子中,看起来是这样的:
<result property="SERVICES_XML" column="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" />请注意,上述更改还将导致<configuration>标记中定义的处理程序工作,因此内联typeHandler可能不再是必要的--这就是我的情况。最后我得到了:
<configuration>
<typeHandlers>
<typeHandler javaType="java.lang.String" jdbcType="CLOB" handler="com.foo.bar.OracleClobTypeHandler"/>
</typeHandlers>
</configuration>和
<result property="SERVICES_XML" column="SERVICES_XML" javaType="string" jdbcType="CLOB" />发布于 2016-11-02 15:26:11
虽然这个问题已经存在了3年,但我敢打赌,这个问题与Oracle从结果元数据中检索到的Oracle‘uppercase’列名有关,而区分大小写的java对象属性名称通常都尊重camel大小写。
然后,除非在SQL查询中使用引用的别名,否则需要显式的列-属性映射。The question has been asked here。与最近的评论中所说的不同,我观察到了引用别名的顺序。
https://stackoverflow.com/questions/20122157
复制相似问题