2013-08-22 11 views
8

Sto provando a produrre un sql che è il seguente in mybatis.Come eseguire l'iterazione tramite HashMap in MyBatis foreach?

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

E il mio tipo di parametro di input è HashMap. Ora Come posso generare SQL dal file xml del mapper. Il codice seguente genera un'eccezione dicendo che la mappa è stata valutata come 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> 

Uno dei altro approccio è quello di creare una classe con campi valore chiave, creare un elenco di oggetti e quindi passare la parameterType come list che assomiglierebbe seguente.

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

Ma c'è un modo per il mio mapper di lavorare per il primo approccio? oltre a modificare la query in unione

risposta

13

Questa soluzione non funziona dalla versione 3.2 - vedere di più in Issue #208!

Finalmente ho la soluzione per HashMap

dovrei usare entrySet() al fine di rendere possibile iterare

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

più Uno isue stavo affrontando nome del parametro non è stato sempre iniettato, Quindi ha aggiunto @Param annotazione

Quindi l'interfaccia del mapper si presenta come di seguito.

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

** Attenzione: questo modo è rotto dalla versione 3.2.x **: - versione 3.2.x ha il supporto diretto per un mappa [numero 709] (https://code.google.com/p/mybatis/issues/detail?id=709) con _ _ e deve essere riscritto in questa nuova forma - vedi [numero 208] (https://github.com/mybatis/mybatis-3/pull/208) o @foghost solution –

+0

Ben precisato –

+0

@MichalBernhard Puoi postare la tua risposta? Ciò aiuterà molto gli altri visitatori. –

1

Nel tuo primo esempio mybatis sta cercando una voce nel parametroMap con il tasto "mappa". Sospetto che tu stia effettivamente provando ad iterare il set di chiavi di parameterMap. Se hai annidato la mappa all'interno della mappa dei parametri usando il tasto "mappa", dovrebbe funzionare.

Nel secondo esempio dovresti essere in grado di passare HashMap.entrySet() che fornisce getKey e getValue.

11

Questo è un esempio nel mio progetto e funziona benissimo

<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

funziona solo dalla versione 3.2.x (consultare [numero 709] (https://code.google.com/p/mybatis/issues/detail?id=709) –