2009-10-28 4 views
17

Ich verwende iBATIS, um Select-Anweisungen zu erstellen. Nun möchte Ich mag die folgende SQL-Anweisung mit iBATIS implementieren:Wie verwende ich eine IN-Klausel in iBATIS?

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

Mit dem folgenden Ansatz wird die Aussage nicht richtig und kein Ergebnis vorbereitet:

SELECT * FROM table WHERE col1 IN #listOfValues#; 

iBATIS scheint diese Liste zu restrukturieren und versucht es als String zu interpretieren.

Wie kann ich die IN-Klausel richtig verwenden?

Antwort

31

Hier ist ein Blog-Post, die Ihre Frage beantwortet:

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> 

Und in Java sollten Sie in einem java.util.List passieren . Z.B.

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

all diese XML macht mich wollen kotzen, aber thx für die Info sehr hilfreich für ein Projekt, wo ich Ibatis verwenden muss – Rick

+2

Ich kann nicht glauben, dass ich gerade eine iBatis Frage/Antwort upvoted. Wann wird dieses Projekt vorbei sein und ich kann aufhören, iBatis zu benutzen? –

+1

Nein, iBatis ist fantastisch. Zumindest kannst du SQL anstatt einer anderen Abscheulichkeit schreiben. –

11

Wie wäre es

<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

Danke, ich war zu dumm um zu recherchieren, wie es aussieht. – guerda

+0

Danke, du rettest mein Leben: D – glider

4

Oder:

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

Sie können es wie folgt verwenden:

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

die $ in der Anweisung verwendet wird.

+0

dies erzeugt etwas wie [aaa, abb, acc] können Sie vorschlagen, wie kann ich diesen Standard '[]' in '()' ändern, weil Oracle '' – Saif

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

nicht unterstützt Möchten Sie Ihren Code kommentieren? Wenn es vor 2 Jahren noch eine andere akzeptierte Antwort mit 9 Upvotes gibt, was fügt deine Antwort dann hinzu, dass das eine nützliche Antwort sein kann? – Yaroslav

0

Eine alte Frage, aber für die Nutzer von Mybatis ist die Syntax ein wenig anders:

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

zum guide in here finden.