ibatis出现AutoResultMap错误的问题

来源:互联网 发布:黑马c语言视频云盘 编辑:程序博客网 时间:2024/05/18 15:07

为了能够让ibatis动态执行传入的sql,我只在ibstis配置文件里配置了一个查询语句,配置如下:

<select id="queryObjectForSql" resultClass="java.util.HashMap"  
  parameterClass="java.lang.String">
  $sql$

 </select>

传入SQL:

select substr(t.form_id,2) as ACTIVITYID from swfformtablemgr t where t.form_id like 'F'||'50012%'

这莫名其妙出现如下错误:

com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in com/sitech/ismp/prealarm/maps/sendPreAlarm.xml. 
--- The error occurred while applying a result map. 
--- Check the queryObjectForSql-AutoResultMap. 
--- Check the result mapping for the 'PROCESSID' property. 
--- Cause: java.sql.SQLException: 列名无效
 at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:201)
 at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:139)
 at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:567)
 at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
 at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
 at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:94)
 at com.sitech.ismp.prealarm.dao.impl.SendPreAlarmDaoImpl.queryObjectForSql(SendPreAlarmDaoImpl.java:34)
 at com.sitech.ismp.prealarm.service.impl.SendPreAlarmServiceImpl.queryObjectForSql(SendPreAlarmServiceImpl.java:27)
 at com.sitech.ismp.prealarm.util.ScanedTaskAndSendPreAlarm.SendPreAlarm(ScanedTaskAndSendPreAlarm.java:51)

查找半天无果,将sql直接放到数据库执行没有任何错误,执行的sql中并没有PROCESSID字段,为何会报列明无效错误,极度郁闷快哭了。。。

后来才知道由于sql是动态传入的,每次执行的语句可能会不同,查询的结果也会不同,而ibatis为了避免经常的对返回的结果进行内省,ibatis会记录上一次查询结果的元数据, ibatis会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。在 【statement】, 【select】, 和【procedure】 标签中存在一个可选的属性【remapResults】,默认值是false.如果每次查询的列不定的话,这个属性需要设置为true.

更在:

<select id="queryObjectForSql" resultClass="java.util.HashMap" remapResults="true"
  parameterClass="java.lang.String">
  $sql$

 </select>

OK,问题解决。不过remapResults属性会造成一定的性能损失,所以要谨慎使用,只在你需要的时候使用--查询列发生变化时