使用mybatis处理oracle数据库查询操作时遇到了一个魔术问题。 我从oracle数据库中查询了一些列,并将resultType设置为Map,该查询工作正常,但是当我尝试从Map变量中获取一个值并将该值传输到String对象时,出现了强制转换异常:“ java。 sql.Timestamp无法转换为java.lang.String”
我的Java Mapper代码如下:
@Mapper
public interface DynamicDataMapper {
Map<String, String> selectDataDetail(@Param("traceRuleDO") TraceRuleDO traceRuleDO, @Param("traceQueryVO") TraceQueryVO traceQueryVO);
}
我的Mybatis XML映射器文件如下:
<select id="selectDataDetail" resultType="java.util.Map" statementType="STATEMENT" >
<!--select ${traceRuleDO.shownColumns}-->
select *
from ${traceRuleDO.tableName}
where ${traceRuleDO.primaryKey} = ${traceQueryVO.keyValue}
<if test="traceQueryVO.secondaryKeyName != null and traceQueryVO.secondaryKeyName != ''">
and ${traceRuleDO.secondaryKey} = ${traceQueryVO.secondaryKeyValue}
</if>
</select>
当我使用此接口查询表时,该查询有效。但是,当我尝试获取oracle数据库中“ Date”类型的值并将该值设置为String类型变量时,发生了异常: / p>
String date = dataMap.get("startDate");//the startDate is of "Date” type in db
让我感到困惑的是,为什么可以查询并得到结果,但是当我从地图中获得价值时却不能?
除了这个问题的原因,我也很好奇满足这种查询需求的解决方案。感谢您的帮助!
答案 0 :(得分:2)
我认为String date = dataMap.get("startDate");
类似于String date = (String)Object;
,如果对象不是String,则抛出ClassCastException,可以将Map<String, String>
更改为Map<String, Object>
或创建mybatis typeHandlers。您可以尝试一下,我不确定我是对的,但是希望我能为您提供帮助。
答案 1 :(得分:0)
java泛型类型在编译后将被擦除,因此map中的值类型是实际类型,而不是您通过泛型声明的类型