6
votes

Foreach imbriqué en mybatis 3 pour un paramètre hashmap

J'essaie de trouver une solution au problème suivant à l'aide de MyBatis 3.0.6:

Je dois construire une instruction de sélection dynamique basée sur une série de paramètres, dont l'une est de type hashmap > code>. Le défi consiste à comprendre comment faire des mybatis iTerez sur toutes les clés dans une boucle extérieure foreach em> et itérer sur les éléments de la liste de valeurs dans la boucle interne. P>

Pour illustrer, supposons que mon paramètre de carte de hachage appelé filtre em> stry> contient des états (listes de codes d'état, chaque liste étant la valeur) par pays (code de pays comme clé) comme: p> xxx pré>

J'ai besoin de mon SQL dynamique pour ressembler à ceci (sous une forme grossièrement simplifiée): p> xxx pré> je voudrais imaginer mon mapper xml devrait ressembler à quelque chose comme ceci: p> xxx pré>

donc la question est la suivante: quelle est la syntaxe appropriée pour obtenir le pays pays strong> à itérer dans la boucle usée imbriquée em> p>


update strong> p>

Après quelques bricoles, je ne pouvais pas obtenir de façon gentiment avec L'approche basée sur HASHMAP, donc j'ai fini par ajouter une nouvelle classe qui mappe plusieurs valeurs à leur valeur mère, puis transmettez une liste de tels objets à MyBatis. En utilisant l'exemple des pays / états ci-dessus, la classe ressemble à: p> xxx pré>

la méthode DAO: p> xxx pré>

et le MYBATIS Mappage: P>

<select id="getData" resultType="QueryResult">
SELECT *
FROM  Table1
WHERE ... some static criteria goes here...
     <if test="criteria!= null">
         <foreach item="filter" index="i" collection="criteria" separator="AND" open="AND">
             RowId IN (SELECT RowId 
                       FROM Table2 
                       WHERE Country = #{filter.country} AND State IN
             <foreach item="state" index="j" collection="filter.states" separator="," open="(" close=")">
                 #{state}
             </foreach>
         </foreach>
     </if>
</select>


0 commentaires

3 Réponses :


3
votes

En réalité, vous pouvez utiliser la valeur du pays pour la regarder dans la carte de filtrage et le faire fonctionner comme vous l'avez initialement. Dans la deuxième boucle, votre collection sera définie comme filtre.get (pays) et cela devrait être bon. Ceci est bien sûr envisagé d'interpréter votre question correctement.


0 commentaires

1
votes

J'ai eu quelque chose à insérer comme une carte où chaque clé de carte correspond à une liste. J'ai écrit la requête de cette façon.

INSERT INTO TB_TEST (group_id, student_id) VALUES
<foreach collection="idMap.entrySet()" item="element" index="index" separator=",">
         <foreach collection="element.value" item="item" separator="," > 
            ( #{element.key}  #{item} )     
         </foreach> 
    </foreach>


1 commentaires

CETTE! corrigé pour moi. Merci!



1
votes

Dès maintenant, je peux le faire.

<foreach collection="myMap" index="key" item="value">
  <foreach collection="value" item="element">
    ... = #{key} ...
    ... = #{element})
  </foreach>
</foreach>


0 commentaires