2013-08-22 5 views
8

Ich versuche, eine SQL zu erzeugen, die wie unten in mybatis ist.Wie durch HashMap in MyBatis foreach zu iterieren?

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

Und mein Eingabeparameter Typ ist HashMap. Jetzt Wie generiere ich SQL aus Mapper XML-Datei. Der folgende Code löst die Ausnahme aus, die besagt, dass map auf null ausgewertet wurde.

<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> 

Einer der anderen Ansatz ist eine Klasse mit Schlüsselwertfelder zu erstellen, um eine Liste von Objekt erstellen und dann übergeben Sie die parameterType als list, die wie folgt aussehen würde.

<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> 

Aber gibt es einen Weg zu meinem Mapper Arbeit für den ersten Ansatz? anders als Ändern der Abfrage zu Union

Antwort

13

Diese Lösung funktioniert nicht seit Version 3.2 - siehe mehr unter Issue #208!

Schließlich habe ich die Lösung für HashMap

I entrySet() um iteratable zu machen, verwenden Sollte

<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> 

Ein weiterer isue I Parametername war mit Blick wurde nicht injiziert zu werden, daher @Param hinzugefügt Annotation

Daher Mapper-Schnittstelle sieht wie folgt aus.

List<TblData> selectCOLC(@Param("entries") 
      HashMap<String, String> entries) 
+8

fein ** ACHTUNG: Diese Möglichkeiten seit Version 3.2.x ist gebrochen **: - Version 3.2.x hat direkte Unterstützung für eine Karte [Problem # 709] (https://code.google.com/p/mybatis/issues/detail?id=709) mit _ _ und es muss in dieses neue Formular umgeschrieben werden - siehe [Issue # 208] (https://github.com/mybatis/mybatis-3/pull/208) oder @foghost solution –

+0

Gut darauf hingewiesen –

+0

@MichalBernhard Können Sie bitte posten deine eigene Antwort? Das wird den Besuchern viel weiterhelfen. –

1

In Ihrem ersten Beispiel sucht mybatis nach einem Eintrag in der ParameterMap mit dem Schlüssel "map". Ich vermute, dass Sie tatsächlich versuchen, den Schlüsselsatz der ParameterMap zu iterieren. Wenn Sie die Karte innerhalb der Parameterkarte mit dem Schlüssel "map" verschachtelt haben, sollte es funktionieren.

Im zweiten Beispiel sollten Sie in der Lage sein, die HashMap.entrySet() übergeben, die einen getKey und getValue bereitstellt.

11

dies ist ein Beispiel in meinem Projekt und es funktioniert

<select id="getObject" parameterType="Map" resultType="hashmap">  
    select * from TABL where 
    <foreach collection="dataMap" index="key" item="value" open="" separator=" and " close=""> 
     #{key}=#{value} 
    </foreach> 
</select> 
+1

dies funktioniert erst seit Version 3.2.x (siehe [Problem # 709] (https://code.google.com/p/mybatis/issues/detail?id=709) –