为什么我无法从基于mybatis的sql查询中获取的Map <string,string>变量获取值?

时间:2019-01-14 08:36:58

标签: java oracle11g spring-mybatis

使用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

让我感到困惑的是,为什么可以查询并得到结果,但是当我从地图中获得价值时却不能?

除了这个问题的原因,我也很好奇满足这种查询需求的解决方案。感谢您的帮助!

2 个答案:

答案 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中的值类型是实际类型,而不是您通过泛型声明的类型