需求背景:
客户要求多种多样,图片展示排序也是个性化突显,现场需要拍十张图片上传取证,但个性客户要求前5张图片要指定5个类型且指定排序,后五张不指定,故设计数据库表的时候,在全局参数配置表中增加一个顺序的参数(下面会贴上图),一是在取证拍照时候,前端根据参数配置的顺序去排版,二是在图片回显时候,也根据这个参数配置的类型数据去回显。
过程:
1.参数配置如图:
2.前端拍照框展示:
前端会调取后端公共接口去获取参数配置表数据,根据上面图一中的顺序去展示。
3.前端页面回显
3.1前端页面也许按照参数配置表中的值展示,这时候需要后端去排好序传给前端,前端按照后端给的数据顺序去展示。
3.2.后端排序
按照指定规则排序,在Navicat中,写好SQL语句,测试,看结果,没问题,如下图:
语法就是:select * from table_name order by field(status,5,1,2,3,4);
接下来就是代码实现,但遇到了一个坑,一开始入参,是从参数配置表中查询出来的(String类型)字段和值,直接和其他查询条件一起入参了,sql语句:order by FIELD(imageTypeNo,#{sort}) asc
结果发现查询出来的列表排序是乱的.
仔细想想,发现不对,这样入参,被解析后是这个结果:
order by FIELD(imageTypeNo,'06,03,02,04,05,01') asc;
而我们需要的是:
order by FIELD(imageTypeNo,06,03,02,04,05,01) asc
也就是没有引号:‘’,
那就是入参不能是String类型的字符串,而应该是List,代码中String转成List:
StringBuffer s1 = new StringBuffer(sortCode);
String[] sort = s1.split(",");
sortList = Arrays.asList(sort);
入参后的SQL排序语句:
<if test="sortList != null and sortList.size() != 0">
order by FIELD(t2.ATTACH_TYPE,
<foreach item="item" index="index" collection="sortList" separator=",">
#{item}
</foreach>) asc
</if>
这个SQL语句也是要注意一点,我一开始按照下面这样格式写了,也不行,需要去掉:open="(“和close=”)",才可以。
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>