今天遇到一个多级联动查询的场景,学习到了choose关键字的用法,特地记一下。
问题场景:
开发过程中关于物资明细的查询,原型如下:
需求:查询出库的物资列表,以及每个物资对应的详细信息,其中物资名称和物资型号同后面的物资编号、资产号等不在同一张表内。
因此我们只要根据物资编号就可以确定一个物资,逻辑如下:
1. 先选择物资名称,根据物资名称查询物资型号;
2. 再根据物资名称、型号查询物资编号
3.最后根据物资编号查询出物资的详细信息补全后续字段的信息展示。
问题解析:
其实这就是一个多级联动查询,通过前置条件确定后置条件,然后将确定的所有条件重新作为前置条件确定后面未知的后置条件,以此类推。
Mapper层sql:
<select id="selectInfo" resultType="java.lang.String">
SELECT
<choose>
<when test="mc.deviceName != null and mc.deviceName != ''">
DISTINCT mc.device_model
</when>
<otherwise>
DISTINCT mc.device_name
</otherwise>
</choose>
FROM material_category mc
<where>
mc.delete_flag = 0
<if test="mc.deviceName != null and mc.deviceName != ''">
AND mc.device_name = #{mc.deviceName}
</if>
</where>
关于这段sql的解释如下:
这样做的好处:
将多个查询合并了,省略了接口编写。不然想要实现物资明细查询,我们需要做的操作冗余的多:
【1】首先列表查询出所有物资名称
【2】然后根据物资名称列表查询出所有物资型号
【3】再根据物资名称、型号精确查询出物资编号
【4】最后根据物资编号,查询出物资详细信息
这时候在select和where后面巧用choose关键字就为编码方便了很多。