1

このコードでこの例外が発生しています

 List<String> addlCarrierClause=new ArrayList<String>();

<select id="GET_SEARCH_RESULTS" parameterClass="Map" resultClass="HashMap">

<isNotEmpty  prepend=" AND " property="addlClauseGtwyTemp">
    l.imp_gtwy_i in
        <iterate property="addlClauseGtwyTemp" open="(" close=")" conjunction=",">
            #addlClauseGtwyTemp[]#
        </iterate>
</isNotEmpty>

com.ibatis.common.jdbc.exception.NestedSQLException :

The error occurred while preparing the mapped statement for execution.  
--- Check the GET_SEARCH_RESULTS.  
--- Check the parameter map.  
--- Cause: com.ibatis.sqlmap.client.SqlMapException: ParameterObject or property was not a Collection, Array or Iterator.
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

iterate tagを正しく使用していますか?
これを実装するために他に何を確認する必要がありますか

4

1 に答える 1

3

iBatis<iterate>タグは、アイテムのリストを循環させたい場合にのみ使用します。反復タグの使用法が正しく、プロパティaddlClauseGtwyTempが存在する場合は、取得してNullPointerExceptionいないものを取得します。したがって、問題は単純に、addlClauseGtwyTempがリストまたは反復可能なコレクション (反復可能なインターフェイスを実装する) ではなく、フラットな値であることです。

問題をローカルでシミュレートでき、ログに同じスタック トレースが記録されました

2013-09-02 17:04:59,724 ERROR UNEXPECTED_EXCEPTION: An unexpected error occurred processing wlm.search
com.xyz.event.InvalidEventStateException: wlm.searchCO:
--- The error occurred in workListManagementSearchService.xml.
--- The error occurred while preparing the mapped statement for execution.
--- Check the getWLMSearchCustomers.
--- Check the parameter map.
--- Cause: com.ibatis.sqlmap.client.SqlMapException: ParameterObject or property was not a Collection, Array or Iterator.
        at com.xyz.event.Query.execute(Query.java:67)
        at com.xyz.event.AbstractParentExecutable.executeChildren(AbstractParentExecutable.java:35)
        at com.xyz.event.Event.execute(Event.java:32)
        at com.xyz.event.impl.d$a.processEvent(EventContextFactory.java:56)

解決

プロパティaddlClauseGtwyTempがリストまたはコレクションであり、フラットな値ではないことを確認してください。

リスト

addlClauseGtwyTemp = [Asia,America,Austalia,Africa,SouthAmerica,Europe] 

非リスト

addlClauseGtwyTemp = Asia

追加のヒント

あなたの場合、このプロパティaddlClauseGtwyTempは null ではなく、タグ("" or size() < 1)を使用して空ではありません。<isNotEmpty>

プロパティが null でないかどうかのみをチェックし、プロパティaddlClauseGtwyTempが空でないかどうか、つまり、プロパティaddlClauseGtwyTempのサイズが1 未満かどうかはチェックしないため、使用<isNotEmpty>は使用よりも効率的であることもお勧めします。 . null の場合、またはサイズが 1 未満の場合、そのタグにネストされたコードは実行されません。しかし、その物件があなたの条件を満たしていない場合はどうなるでしょうか? 質問に貼り付けたコードを使用すると、クエリはエラーをスローします。これは、条件が満たされない状況を処理するために、これの逆を行う前のコードが必要であることを意味します。<isNotNull><isNotNull>size() < 1<isNotEmpty>

<select id="GET_SEARCH_RESULTS" parameterClass="Map" resultClass="HashMap">

    <isNotEmpty  prepend=" AND " property="addlClauseGtwyTemp">
        l.imp_gtwy_i in
        <iterate property="addlClauseGtwyTemp" open="(" close=")" conjunction=",">
        #addlClauseGtwyTemp[]#
        </iterate>
    </isNotEmpty>

    <isEmpty  prepend=" AND " property="addlClauseGtwyTemp">
       1=2
    </isEmpty>

    <isNull property="addlClauseGtwyTemp">
          select 1 from dual (Oracle syntax)
          select 1 (Postgres/MySQL)
    </isNull>

</select>

<isEmpty>タグを使用してisNotEmptyの逆をチェックするフラグメントを追加しました<isNull>。null の場合、クエリは何もせず、エラーをスローします。

于 2013-09-02T09:41:28.800 に答える