一,问题描述
今天做项目的时候遇到了一个需求,就是按照客户的名字模糊查询合同表。然后看了一下合同表,里面并没有客户名这个字段,有的是一个客户id,所有关于客户的东西都是通过它连表查询出来的,作为一个新手,这显然对我有一定的困难。
二,解决
最终我的解决思路就是——子查询,用in做判断条件。直接上代码:
<select id="selectEsContractList" parameterType="EsContract" resultMap="EsContractResult">
<include refid="selectEsContractVo"/>
<where>
<if test="customer != null ">
and customer_id in (select id from es_customers where name like concat('%', #{customer}, '%'))
</if>
<if test="itemId != null and itemId != ''"> and c.item_id = #{itemId}</if>
<if test="buildId != null "> and c.build_id = #{buildId}</if>
<if test="unitId != null "> and c.unit_id = #{unitId}</if>
<if test="doorId != null "> and c.door_id = #{doorId}</if>
<if test="payphase != null and payphase != ''"> and payphase = #{payphase}</if>
<if test="deptId != null "> and c.dept_id = #{deptId}</if>
<if test="userId != null "> and c.user_id = #{userId}</if>
<if test="userId != null "> and c.channel_id = #{channelId}</if>
</where>
</select>
这就是那一部分的代码,当传来的customer(客户名)不为空时,if里面的sql语句就会生效,
select id from es_customers where name like concat('%', #{customer}, '%')就会查出所有符合条件的客户(只查了id),当合同表中的记录的customer_id字段在(in)这个查询结果中,就会被查出来。
postman测试,数据因为懒所以只有一个客户, 但从他们合同id不一样可以看出来是正确的。