2010-07-29 24 views
6

Tengo una lista de objetos en los que quiero iterar y acceder a un campo en particular en ibatis sql.Iterar la lista de objetos en Ibatis

Ej.

public Class Student 
{ 
String id; 
String name; 
} 

voy a pasar como parámetro una lista de objetos de Estudiantes (Lista (Estudiante))
y hacer iteración Acceso al código para cada bean objeto. ¿Cómo hago esto?

Respuesta

11

foreach -tag es lo que estás buscando. Ejemplo:

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

Véase el user guide para obtener más información, capítulo "SQL dinámico".

Por cierto, iBatis ya no está desarrollado y está congelado, ahora se llama "MyBatis" y todo el equipo desarrollador se mudó de Apache al new MyBatis home.

+0

gracias. Trataré de ver si esto existe en ibatis2 y tal vez cambiar a mybatis. – cedric

5

Un ejemplo simple.

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

Consulte iBatis documentation para obtener más información.

Como Sylar señaló, el equivalente Java sería

<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 que permite a las variables y el índice de elemento que se puede utilizar dentro del bucle.

+0

Esto es cierto para .NET iBatis, pero falsa para Java iBatis. En Java, la etiqueta foreach se usa para iterar sobre las colecciones. – Sylar

+1

No creo que la diferencia sea .NET vs Java pero ibatis2 vs ibatis3. Estoy usando ibatis2 en Java y usando la etiqueta iterate. también usa la sintaxis # [] # y no la # {}. – Dave

2

intentar algo como:

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

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

<select> 

donde id y name son campos de Student clase y mi parameterClass es List<Student>.

Funcionó para mí.

El SQL formada dinámicamente se verá así:

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

auto explicado, agradable. – Saif

+0

¿Cómo se especifica una clase que contenga '<' and '>' en el atributo parameterClass? – RyanHennig

Cuestiones relacionadas