如何解决动态数据表名,动态字段名情况下,由
ibatis
缓存
select
字段而引起的
字段找不到的情况?以下是最简单的解决办法!
当使用动态表,动态字段时,会引起字段名的缓存,以下是解决办法。
先看一个例子。下面是段
SQL
语句
id="select_resData_bycondition"
parameterClass="java.util.HashMap"
resultClass="java.util.HashMap" remapResults="true" >
select $fieldnames$ from $resourcetable$ where 1=1
前台传入的
hashmap
变量中,有动态数据表名,及字段名,
Dao
里面的调用方法如下:
//
根据动态数据表名及动态选择的字段按条件分页查出相应的数据
,
注意清除缓存的使
用
public void getResDataByCondition(Page page) {
// TODO Auto-generated method stub
super
.queryForListPagination("select_resData_bycondition",
page);
}
父类的
queryForListPagination
如下:其中
page
这个变量是对
dataset
进行一些
封装,对查询条件封装。
public
void
queryForListPagination(String
statementName,Page
page){
…
.
略
}
由于多个菜单会调用到这个
dao
中的
getResDataByCondition
方法,也就去调用
Id
为
select_resData_bycondition
的
select
语句,由于
ibatis
的缓存机制,
当第一次调用这个
select
语句时,会将字段查询出来,放入缓存中,比如第一个表
是
user
人员表,有字段
gh,name,gz
等字段,则第二次调用时,前台传入了表名是
Dwbm
部门表,有字段
bmbm,bmmc
等,看了
ibatis
的源码,知道
ibaits
中缓存列名的地方在这里:
com.ibatis.sqlmap.engine.mapping.result .AutoResultMap
public
synchronized
Object[]
getResults(StatementScope
statementScope, ResultSet rs)