`

ibatis resultclass "java.util.hashmap" 缓存问题

阅读更多

在做ibatis项目过程中遇到如下样式动态查询

<select id="searchByKW"      resultClass="java.util.HashMap"   
        parameterClass="java.util.HashMap">   
        <![CDATA[ 
     select * from $username$.$tablename$ where contains($username$.$tablename$.$colname$,'$kw$')>0 
     ]]>   
</select>  

 

这样的可以对不同表进行查询,返回结果映射到HashMap中,但是使用中发现当第一次使用这个语句时是可以的,但是当使用这个语句再查询别的表时报错了,这个问题是因为你查询的sql的列是变化的,但是ibatis默认的会缓存RS中的meta信息,如果你第一次查询的列和第二次查询的列不一样的话,那么第二次ibatis还会以第一次查询的列为key从RS里面获取数据,但是你的列是变化的,所以第二次取数据的时候,RS里面已经没有了你第一次的那个列了,所以会出错。 错误原因是从结果集到HashMap的映射时还按照上个表的字段进行装载,说明ibatis对上个表的结构进行了映射缓存。

使用remapResults这个属性,可以重新映射结果集。

配置文件修改如下

<select id="searchByKW"  remapResults="true"   resultClass="java.util.HashMap"    parameterClass="java.util.HashMap">   
    <![CDATA[ 
         select * from $username$.$tablename$ where contains($username$.$tablename$.$colname$,'$kw$')>0 
     ]]>   
</select>   
 

 

 

 

分享到:
评论

相关推荐

    ibatis 用HashMap解决resultClass映射

    &lt;select id="getDynamicTable" resultClass="java.util.HashMap" remapResults="true" parameterClass="java.lang.Integer"&gt; select t.* from some_table t where t.status = #{status} ``` 这里需要注意的是,`#...

    解决IBatis缓存动态字段问题

    resultClass="java.util.HashMap" remapResults="true"&gt; select $fieldnames$ from $resourcetable$ where 1=1 ``` 这里的 `&lt;select&gt;` 标签定义了一个查询语句,其参数类型为 `HashMap`,返回结果也是 `...

    IBATIS调用存储过程

    &lt;procedure id="P_DJ_GETRYANDPYRBYRYID" parameterMap="parameterDJRYID" resultClass="java.util.HashMap"&gt; {call P_DJ_GETRYANDPYRBYRYID(?)} ``` 这里出现了一个问题,就是当只有一个问号`?`时,iBATIS默认...

    ibatis的多参数查询.doc

    针对ibatis的多参数查询问题,这里介绍三种常见的解决方法: ##### 1. 使用字符串(String)替代 **实现方式:** - 在SQL映射文件中,定义`&lt;select&gt;`标签的`parameterClass`属性为`java.lang.String`。 - 直接在...

    ibatis高级特性

    &lt;select id="getUsersByCriteria" parameterClass="java.util.Map" resultMap="get-user-result"&gt; &lt;![CDATA[ select id, name, sex from t_user != null"&gt; where name like #{name} ]]&gt; ``` 通过 `&lt;if&gt;`...

    Ibatis资料ibatai sql map iBATIS使用$和#的一些理解

    &lt;select id="getPeopleList" resultClass="model.User" parameterClass="java.util.Map"&gt; &lt;![CDATA[ select * from test where name like '%$name$%' ]]&gt; ``` 在Java代码中,我们创建一个HashMap,并将参数放入...

    Spring and iBATIS

    &lt;select id="selectUser" parameterClass="java.lang.String" resultClass="User"&gt; SELECT * FROM USERS WHERE NAME = #value# ``` **步骤3:编写DAO接口和实现** 定义一个`UserDao`接口,并使用Spring的`...

Global site tag (gtag.js) - Google Analytics