ibatis <iterate>标签
我们可以在ibatis的 sqlmap包中找到对iterate标签的定义(sql-map-2.dtd)
我们可以看到,iterate标签支持的参数如下:
Iterate 的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 类型为 java.util.List 的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义 AND 或 OR(可选)
遍历类型为 java.util.List的元素。
举例:
<select id="MS-JOB-QUERY-BY-STATES-FROM-NUM" resultClass="java.lang.Integer">
select /*MS-JOB-QUERY-BY-STATES-FROM-NUM*/ COUNT(1)
FROM bp_job
WHERE
state in
<iterate property="states" open="(" close=")" conjunction=",">
#states[]#
</iterate>
LIMIT 1
</select>
遍历List<List<>>嵌套list结构化数据
定义一个学生类的pojo对象
public class Student{
string name;
List subject
Student(string name, List subject){
this. name = name;
this. subject = subject;
}
}
我们希望通过动态拼接得到一个什么样的sql呢:
select * FROM student WHERE (
(name = '张三' AND subject IN ('数学','英语') )
OR (name = '李四' AND subject IN ('数学','物理') )
OR (name = '王五' AND subject IN ('计算机','英语') )
)
sqlmap中的写法
<select id="MS-JOB-QUERY-BY-STATES-FROM-NUM" resultClass="java.lang.Integer">
select /*MS-JOB-QUERY-BY-STATES-FROM-NUM*/ COUNT(1)
FROM student
WHERE
<iterate property="student" open="(" close=")" conjunction="OR">
name = #states[].name# AND subject IN
<iterate property="states[].subject" open="(" close=")" conjunction=",">
#states[].subject[]#
</iterate>
</iterate>
</select>