1. 程式人生 > >在ibatis中使用Dynamic SQL時property屬性的用法

在ibatis中使用Dynamic SQL時property屬性的用法

--- 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的方式來訪問了。