现在的位置: 首页 > 综合 > 正文

在ibatis中使用Dynamic SQL时property属性的用法

2013年04月18日 ⁄ 综合 ⁄ 共 4077字 ⁄ 字号 评论关闭
--- 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的方式来访问了。

抱歉!评论已关闭.