在ibatis中使用Dynamic SQL時property屬性的用法
阿新 • • 發佈:2019-01-25
--- 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的方式來訪問了。