12

私はmybatisで以下のようなSQLを作成しようとしています。

SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in ( ('kp','kar'),('srt','sach'));

私の入力パラメーターの型は HashMap です。マッパーxmlファイルからSQLを生成するにはどうすればよいですか。以下のコードは、マップが null に評価されたことを示す例外をスローします。

<select id="selectCOLC" parameterType="java.util.HashMap" resultType="String">
    SELECT COL_C
    FROM TBLE_1
    WHERE (COL_A, COL_B) in 
    <foreach item="item" collection="#{map.keySet()}" open="((" separator="),(" close="))">
        #{item},#{item.get(item)}
    </foreach>
</select>

他のアプローチの 1 つは、キー値フィールドを持つクラスを作成し、オブジェクトのリストを作成してから、次のようにparameterTypeasを渡すことです。list

<select id="selectCOLC" parameterType="list" resultType="String">
        SELECT COL_C
        FROM TBLE_1
        WHERE (COL_A, COL_B) in 
        <foreach item="item" collection="list" open="((" separator="),(" close="))">
            #{item.getKey()},#{item.getVal()}
        </foreach>
    </select>

しかし、最初のアプローチでマッパーが機能する方法はありますか? クエリをユニオンに変更する以外

4

4 に答える 4

15

この解決策はバージョン 3.2 以降では機能しません - 詳しくはIssue #208を参照してください!

最後に、HashMapの解決策を見つけました

entrySet()反復可能にするために 使用する必要があります

<select id="selectCOLC" parameterType="map" resultType="kpMap">
    SELECT COL_C
    FROM TBLE_1
    WHERE (COL_A, COL_B) in 
    <foreach item="item" collection="entries.entrySet()" open="((" separator="),(" close="))">
        #{item.key},#{item.value}
    </foreach>
</select>

私が直面していたもう1つの問題は、パラメータ名が注入されていなかったため、@Param注釈が追加されました

したがって、マッパー インターフェイスは次のようになります。

List<TblData> selectCOLC(@Param("entries")
            HashMap<String, String> entries)
于 2014-02-13T14:57:09.843 に答える
1

最初の例では、mybatis は parameterMap でキー「map」を持つエントリを探しています。parameterMapのキーセットを実際に反復しようとしていると思われます。キー「map」を使用してパラメータ マップ内にマップをネストした場合は、機能するはずです。

2 番目の例では、getKey と getValue を提供する HashMap.entrySet() を渡すことができるはずです。

于 2013-09-17T15:24:42.407 に答える