我有一个<resultMap>
,其中一个结果属性为自定义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>
等等
我做错了什么?
经过长时间的挖掘,我终于找到了答案。
这似乎是myBatis中的一个bug。
为了让处理程序为<result>
元素工作,您必须显式指定column
属性,即使property
属性已经与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" />
虽然这个问题已经存在3年了,但我敢打赌这个问题与以下事实有关:Oracle的'uppercases'列名称是从结果元数据中检索的,而区分大小写的java对象属性名称通常尊重camel大小写。
除非在SQL查询中使用带引号的别名,否则需要显式列属性映射。这个问题是在这里提出的。与最新评论中所说的不同,我观察到ORDER BY引用的别名有效。