2009-10-28 14 views
17

J'utilise iBATIS pour créer des instructions select. Maintenant, je voudrais mettre en œuvre l'instruction SQL suivante avec iBATIS:Comment utiliser une clause IN dans iBATIS?

SELECT * FROM table WHERE col1 IN ('value1', 'value2'); 

Avec l'approche suivante, la déclaration n'est pas préparé correctement et aucun retour de résultat:

SELECT * FROM table WHERE col1 IN #listOfValues#; 

iBATIS semble restructurer cette liste et essaie de l'interpréter comme une chaîne.

Comment utiliser la clause IN correctement?

Répondre

31

Voici un blog qui répond à votre question:

iBatis: Support for Array or List Parameter with SQL IN Keyword

<select id="select-test" resultMap="MyTableResult" parameterClass="list"> 
select * from my_table where col_1 in 
    <iterate open="(" close=")" conjunction=","> 
    #[]# 
    </iterate> 
</select> 

Et en Java, vous devez passer dans un java.util.List . Par exemple.

List<String> list = new ArrayList<String>(3); 
list.add("1"); 
list.add("2"); 
list.add("3"); 
List objs = sqlMapClient.queryForList("select-test",list); 
+0

tout ce xml me donne envie de vomir, mais merci pour l'info très utile pour un projet où je dois utiliser ibatis – Rick

+2

Je ne peux pas croire que je viens de upvoted une question/réponse iBatis. Quand ce projet sera-t-il terminé et que je pourrai arrêter d'utiliser iBatis? –

+1

Nah, iBatis est fantastique. Au moins, vous obtenez d'écrire SQL au lieu d'une autre abomination. –

11

Que diriez-vous

<select id="foo" parameterClass="Quuxly" resultClass="Flobitz"> 
    select * from table 
    <dynamic prepend="where col1 in "> 
     <iterate property="list_of_values" open="('" close="')" conjunction=", "> 
      #list_of_values[]# 
     </iterate> 
    </dynamic> 
</select> 
+0

Merci, j'étais trop stupide pour faire des recherches, à quoi ça ressemble. – guerda

+0

Merci, vous sauvez ma vie: D – glider

4

Ou:

<select id="select-test" resultMap="MyTableResult" parameterClass="list"> 
select * from table where 
<iterate property="list" conjunction="OR"> 
    col1 = #list[]# 
</iterate> 
</select> 
-1

Vous pouvez l'utiliser comme ceci:

<select id="select-test" resultMap="MyTableResult" > 
select * from my_table where col_1 in 
$listOfValues$ 
</select> 

utiliser le $ dans la déclaration IN.

+0

cela génère quelque chose comme [aaa, abb, acc] pouvez-vous suggérer comment puis-je changer ce défaut '[]' en '()' car Oracle ne supporte pas '[]' – Saif

0
<select id="select-test" parameterClass="list"resultMap="YourResultMap"> 
    select * from table where col_1 IN 
    <iterate open="(" close=")" conjunction=","> 
     #[]# 
    </iterate> 
</select> 
+1

Voulez-vous commenter votre code? S'il y a une autre réponse acceptée d'il y a 2 ans avec 9 upvotes, qu'est-ce que votre réponse ajoute d'important qui peut être une réponse utile? – Yaroslav

0

Une vieille question, mais pour les utilisateurs de mybatis, la syntaxe est un peu différent:

<select id="selectPostIn" resultType="domain.blog.Post"> 
    SELECT * 
    FROM POST P 
    WHERE ID in 
    <foreach item="item" index="index" collection="list" 
     open="(" separator="," close=")"> 
     #{item} 
    </foreach> 
</select> 

Reportez-vous à la guide in here.