在做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>
分享到:
相关推荐
<select id="getDynamicTable" resultClass="java.util.HashMap" remapResults="true" parameterClass="java.lang.Integer"> select t.* from some_table t where t.status = #{status} ``` 这里需要注意的是,`#...
resultClass="java.util.HashMap" remapResults="true"> select $fieldnames$ from $resourcetable$ where 1=1 ``` 这里的 `<select>` 标签定义了一个查询语句,其参数类型为 `HashMap`,返回结果也是 `...
<procedure id="P_DJ_GETRYANDPYRBYRYID" parameterMap="parameterDJRYID" resultClass="java.util.HashMap"> {call P_DJ_GETRYANDPYRBYRYID(?)} ``` 这里出现了一个问题,就是当只有一个问号`?`时,iBATIS默认...
针对ibatis的多参数查询问题,这里介绍三种常见的解决方法: ##### 1. 使用字符串(String)替代 **实现方式:** - 在SQL映射文件中,定义`<select>`标签的`parameterClass`属性为`java.lang.String`。 - 直接在...
<select id="getUsersByCriteria" parameterClass="java.util.Map" resultMap="get-user-result"> <![CDATA[ select id, name, sex from t_user != null"> where name like #{name} ]]> ``` 通过 `<if>`...
<select id="getPeopleList" resultClass="model.User" parameterClass="java.util.Map"> <![CDATA[ select * from test where name like '%$name$%' ]]> ``` 在Java代码中,我们创建一个HashMap,并将参数放入...
<select id="selectUser" parameterClass="java.lang.String" resultClass="User"> SELECT * FROM USERS WHERE NAME = #value# ``` **步骤3:编写DAO接口和实现** 定义一个`UserDao`接口,并使用Spring的`...