如果你想在MyBatis中传入一个对象列表作为查询条件,每个对象中有两个属性,可以使用foreach元素来处理:
<select id="findUsers" resultType="User">
SELECT * FROM users
WHERE (name, age) IN
<foreach item="item" collection="userList" separator="," open="(" close=")">
#{item.name}, #{item.age}
</foreach>
</select>
在这个例子中,userList是一个包含多个User对象的列表。foreach元素会遍历这个列表,将每个对象中的name和age属性作为查询条件的一部分。注意foreach元素中的item属性指定了当前迭代的对象,
i
t
e
m
.
n
a
m
e
和
{item.name}和
item.name和{item.age}分别引用了它们的属性值。separator属性指定了在每个查询条件之间使用的分隔符,open和close属性指定了整个条件块的开始和结束符号。最终生成的SQL语句可能类似于:
复制
SELECT * FROM users
WHERE (name, age) IN ((‘Alice’, 25), (‘Bob’, 30), (‘Charlie’, 35))
其中,(name, age)是一个元组,表示按照name和age两个属性组合成的唯一键来查询。如果你的表中没有这样的唯一键,你需要使用其他条件来替代。
在 MyBatis 中,可以使用动态 SQL 来解决这个问题。具体实现方式是使用 标签将多个对象拼接成一个 SQL 查询语句。以下是一个示例:
<select id="selectByList" parameterType="java.util.List">
SELECT *
FROM table
WHERE 1=1
<foreach collection="list" item="item" separator="OR">
<if test="item.property1 != null">
AND property1 = #{item.property1}
</if>
<if test="item.property2 != null">
AND property2 = #{item.property2}
</if>
</foreach>
</select>
上述代码中,我们使用了 标签遍历传入的 List 对象,并且在每次遍历过程中使用 标签判断属性是否为 null。如果属性不为 null,则将其作为查询条件拼接到 SQL 中。其中 separator=“OR” 表示每个对象之间使用 OR 连接,也可以改成 AND 或者其他连接符号。