--- 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<RiskOptInfoDO> 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); }
对应的sqlmap
<select id="MS-R-O-INFO-QUERY-INFOS-BY-O-IDS" resultMap="RM-RISK-OPT-INFO"> SELECT ID,T_ID,O_TYPE,O_ID,P_NAME,F_AMOUNT,A_OBJECT,I_TYPE,O_ATTRIBUTE,IS_C,CREATOR,G_CREATE,G_MODIFIED FROM R_O_INFO where O_ID in <iterate property="optIdList" prepend="(" close=")" conjunction=","> #optIdList[]# </iterate> </select>
这样就不会报错!
二、使用property报错的例子
public List<RiskOptInfoDO> queryOptInfosByOptIds(List optIdList) throws DataAccessException { return getSqlMapClientTemplate().queryForList("MS-R-O-INFO-QUERY-INFOS-BY-O-IDS", optIdList); }
对应的sqlmap
<select id="MS-R-O-INFO-QUERY-INFOS-BY-O-IDS" resultMap="RM-RISK-OPT-INFO"> SELECT ID,T_ID,O_TYPE,O_ID,P_NAME,F_AMOUNT,A_OBJECT,I_TYPE,O_ATTRIBUTE,IS_C,CREATOR,G_CREATE,G_MODIFIED FROM R_O_INFO where O_ID in <iterate property="optIdList" prepend="(" close=")" conjunction=","> #optIdList[]# </iterate> </select>
上面这种用法就会报错Caused by: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1。
三、不使用property,不报错
public List<RiskOptInfoDO> queryOptInfosByOptIds(List optIdList) throws DataAccessException { return getSqlMapClientTemplate().queryForList("MS-R-O-INFO-QUERY-INFOS-BY-O-IDS", optIdList); }
对应的xml
<select id="MS-R-O-INFO-QUERY-INFOS-BY-O-IDS" resultMap="RM-RISK-OPT-INFO"> SELECT ID,T_ID,O_TYPE,O_ID,P_NAME,F_AMOUNT,A_OBJECT,I_TYPE,O_ATTRIBUTE,IS_C,CREATOR,G_CREATE,G_MODIFIED FROM R_O_INFO where O_ID in <iterate prepend="(" close=")" conjunction=","> #[]# </iterate> </select>
注意:上面的sqlmap中没有使用property,并且运行不会报错。
原理:
通过上面的三个例子对比大家可以清晰的看到,property属性,针对的是ibatis传入参数的map属性值,如果传入的参数不是map类型的,那么就不能使用property属性
只有传递的参数都使用了map的形式传递进来,才可以使用property形式来使用。
比如示例二中,参数执行以list的形式传入,那么就不能使用property形式来访问。
比如示例一中,参数先放入map中并且命名optIdList,那么在sqlmap中就可以使用property的方式来访问了。