2010-07-29 11 views
6

J'ai une liste d'objets où je veux itérer et accéder à un champ particulier dans ibatis sql.Iterate liste d'objets dans Ibatis

Ex.

public Class Student 
{ 
String id; 
String name; 
} 

je passerai en tant que paramètre d'une liste d'objet étudiant (Liste (étudiants))
et faire itération l'accès à l'identifiant pour chaque grain d'objet. Comment puis-je faire cela?

Répondre

11

Le foreach -tag est ce que vous cherchez. Exemple:

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

Voir la user guide pour plus d'informations, chapitre "sql dynamique". Par ailleurs, iBatis n'est plus développé et est gelé, il s'appelle désormais "MyBatis" et l'ensemble de l'équipe de développeurs s'est éloigné d'Apache au new MyBatis home.

+0

merci. Je vais essayer de voir si cela existe dans ibatis2 et peut-être changer pour mybatis. – cedric

5

Un exemple simple.

<select id="selectFewStudents" resultMap="MyMap" parameterClass="list"> 
    select * from student_table where student_id in 
    <iterate open="(" close=")" conjunction=","> 
     #[]# 
    </iterate> 
</select> 

Pour plus d'informations, référez-vous à .

Comme Sylar a fait remarquer, l'équivalent java serait

<select id="selectFewStudents" resultType="MyMap"> 
    select * from student_table where student_id in 
    <foreach item="currentRow" index="rowNum" collection="list" open="(" separator="," close=")"> 
    #{currentRow} 
    </foreach> 
</select> 

iBatis permet aux variables élément et l'index que vous pouvez utiliser dans la boucle.

+0

Cela est vrai pour iBatis .NET, mais faux pour Java iBatis. En Java, la balise foreach est utilisée pour itérer sur les collections. – Sylar

+1

Je ne pense pas que la différence soit .NET vs Java mais ibatis2 vs ibatis3. J'utilise ibatis2 en Java et en utilisant la balise itérative. en utilisant aussi la syntaxe # [] # et non la syntaxe # {}. – Dave

2

Essayez quelque chose comme:

<select id="StudentsQry" parameterClass="list"> 

select * from STUDENTS where 
(id, name) in 
     <iterate open="(" close=")" conjunction="," > 
       (#[].id# , #[].name#) 
     </iterate> 

<select> 

id et name sont des champs de Student classe et mon parameterClass est List<Student>.

J'ai travaillé pour moi.

Le sql formé sera dynamiquement ressembler à:

select * from STUDENTS where (id, name) in ((1,'a'), (2,'b')) 
+0

moi-même expliqué, agréable. – Saif

+0

Comment spécifier une classe contenant '<' and '>' dans l'attribut parameterClass? – RyanHennig