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 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> J'ai besoin de mon SQL dynamique pour ressembler à ceci (sous une forme grossièrement simplifiée): p> donc la question est la suivante: quelle est la syntaxe appropriée pour obtenir le pays 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> la méthode DAO: p> et le MYBATIS Mappage: P> 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>
<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>
3 Réponses :
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) code> et cela devrait être bon. Ceci est bien sûr envisagé d'interpréter votre question correctement. P>
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>
CETTE! corrigé pour moi. Merci!
Dès maintenant, je peux le faire.
<foreach collection="myMap" index="key" item="value"> <foreach collection="value" item="element"> ... = #{key} ... ... = #{element}) </foreach> </foreach>