在mybatis使用过程中,有时需要传递一个包含多个值的参数,用in来查询这些值范围内的数据,如fid是一个Int类型字段,现在需要查询1,2,3 这三个fid的记录,
直接将 1,2,3作为一个入参传递进来时,需要做些修改才能正确实现In的条件查询。
1.Mysql中的写法
in在where查询条件中可以使用locate函数进行查找,locate(查找字符串,源字符串) 返回值为true或false。
select fid,fname from tb_demo
WHERE LOCATE(CONCAT(',',fid,','),CONCAT(',','1,2,3',','));
mybatis中写法如下:
<select id="getListByCdateTno" resultMap="tmap" parameterType="java.util.HashMap">
select fid,fname from tb_demo
where 1=1
<if test="fid !=null and fid!=''">
and LOCATE(CONCAT(',',fid,','),CONCAT(',',#{fid} ,','));
</if>
</select>
2.Pgsql中的写法
in在where查询条件中可以使用position函数进行查找,position(查找字符串 in 源字符串) 找到返回值位置索引(第一位是1),找不到返回0。
select fid,fname from tb_demo
WHERE position(','||fid||',' in ','||'1,2,3'||',')>0
mybatis中写法如下:
<select id="getListByCdateTno" resultMap="tmap" parameterType="java.util.HashMap">
select fid,fname from tb_demo
where 1=1
<if test="fid!=null and fid!=''">
and position(','||fid||',' in ','||#{fid}||',')>0
</if>
</select>
3.使用foreach的写法,在mybatis中如下:
<select id="getListByCdateTno" resultMap="tmap" parameterType="java.util.HashMap">
select fid,fname from tb_demo
where 1=1
<if test="partNos !=null and partNos.size() > 0">
and area_id in
<foreach collection="partNos" item="partNo" index="index"
open="(" close=")" separator=",">
#{partNo}
</foreach>
</if>
</select>