--- Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:204)
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 org.springframework.orm.ibatis.SqlMapClientTemplate$3.doInSqlMapClient(SqlMapClientTemplate.java:298)
at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:209)
... 47 more
Caused by: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at com.ibatis.common.beans.BaseProbe.getIndexedProperty(BaseProbe.java:86)
at com.ibatis.common.beans.GenericProbe.getObject(GenericProbe.java:54)
at com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.IterateTagHandler.doStartFragment(IterateTagHandler.java:47)
at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.processBodyChildren(DynamicSql.java:156)
at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.processBodyChildren(DynamicSql.java:98)
at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.process(DynamicSql.java:78)
at com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.getParameterMap(DynamicSql.java:60)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:172)
... 53 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at com.ibatis.common.beans.BaseProbe.getIndexedProperty(BaseProbe.java:50)
... 60 more
用ibatis的在使用list的时候遇到这个错误没?
遇到了之后你肯定在网上google原因吧?大多数文章里面说当使用iterate的时候不能使用propertiy字段,如果使用了就报错。
其实这个是很片面的,具体怎么写还要配合java代码一起来看。
下面就举例描述一下,希望大家能够对这里更清楚。
一、使用property,不报错的例子
public List queryOInfosByOIds(List optIdList) throws DataAccessException {
Map param = new HashMap();
param.put("optIdList", optIdList);
return getSqlMapClientTemplate().queryForList("MS-R-O-INFO-QUERY-INFOS-BY-O-IDS", param);
}
这样就不会报错!
二、使用property报错的例子
public List queryOptInfosByOptIds(List optIdList) throws DataAccessException {
return getSqlMapClientTemplate().queryForList("MS-R-O-INFO-QUERY-INFOS-BY-O-IDS", optIdList);
}
三、不使用property,不报错
public List queryOptInfosByOptIds(List optIdList) throws DataAccessException {
return getSqlMapClientTemplate().queryForList("MS-R-O-INFO-QUERY-INFOS-BY-O-IDS", optIdList);
}
对应的xml
注意:上面的sqlmap中没有使用property,并且运行不会报错。
原理:
通过上面的三个例子对比大家可以清晰的看到,property属性,针对的是ibatis传入参数的map属性值,如果传入的参数不是map类型的,那么就不能使用property属性
只有传递的参数都使用了map的形式传递进来,才可以使用property形式来使用。
比如示例二中,参数执行以list的形式传入,那么就不能使用property形式来访问。
比如示例一中,参数先放入map中并且命名optIdList,那么在sqlmap中就可以使用property的方式来访问了。