MyBatis Problème avec la Condition <foreach avec Liste à l'intérieur d'une Carte
Je dois construire une EN condition à l'aide de MyBatis où ont pour passer d'une liste de PARENT_VALUES
être obtenue sur la base de la boucle foreach ci-dessous....
J'ai essayé, mais impossible de résoudre ce problème. Je ne suis pas sûr si
Valeurs Transmises sont:
Map input = new HashMap();
input.put("somedata");
List<String> inConditionList = new ArrayList<String>();
inConditionList.add("P1");
inConditionList.add("P2");
input.put(inConditionList);
sqlSessionTemplate.selectList("getNameAgeDetails", input);
SQL nécessaires:
SELECT P.NAME, P.AGE
FROM PERSON_DETAILS P
WHERE SOMECOLUMN is NULL AND DATA IN
(SELECT DATA FROM PARENT_TABLE WHERE PARENT_VALUE IN ("P1, "P2"))
ORDER BY P.NAME
FETCH FIRST 10 ROW ONLY
MyBatis Mappeur SQL:
<select id="getNameAgeDetails" parameterType="map" resultMap="someResultMap">
<![CDATA[
SELECT P.NAME, P.AGE
FROM PERSON_DETAILS P
WHERE
SOMECOLUMN is NULL
AND DATA IN
(SELECT DATA
FROM PARENT_TABLE
WHERE PARENT_VALUE IN
<FOREACH item="item" index="index" collection="list" separator="," open="(" close=")">
${item}
</FOREACH>
)
ORDER BY P.NAME
FETCH
FIRST 10 ROW ONLY
]]>
</select>
Ci-dessous est l'Erreur que j'obtiens quand j'essaie de lancer mon Unité de cas de tests:
### The error occurred while setting parameters
### SQL: SELECT P.NAME, P.AGE
FROM PERSON_DETAILS P
WHERE
SOMECOLUMN is NULL
AND DATA IN
(SELECT DATA
FROM PARENT_TABLE
WHERE PARENT_VALUE IN <FOREACH item="item" index="index" collection="list" separator="," open="(" close=")"> ? </FOREACH>
### Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=PARENT_VALUE IN
<foreach it;TION
WHERE;<space>, DRIVER=3.63.75
; bad SQL grammar []; nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=PARENT_VALUE IN
- Note: je ne suis pas à l'aide de déclarations préparées à l'avance dans le ci-dessus #{item} a été l'un des essais que j'ai essayé, mais je vois toujours des échecs.
- stackoverflow.com/questions/18388936/..., vous pouvez cocher cette question
- J'ai regardé le lien ci-dessus plus tôt, mon cas est différent de ce qui a été posté il y a...
- Est foreach arriver substitué? Je suppose que depuis que vous êtes à l'application CDATA pour l'ensemble de la déclaration, <foreach est ignorée et l'intégralité de la déclaration est utilisé pour la requête.
- C'est correct foreach n'est pas prise en subtituted..je ne suis pas sûr de la façon de les corriger..
- Juste supprimer la balise CDATA requis lorsque vous êtes à l'aide de balises xml comme <, >, etc
Vous devez vous connecter pour publier un commentaire.
Votre instruction Select voudrais quelque chose comme cela
Je suis d'accord avec Karthik Prasad et si vous supprimez CDATA et avoir qqch comme
vous devez faire le XML échapper comme ci-dessous: