前言
mybatis 是国内主流的数据访问层映射框架,但有时过滤条件的判断让人头大,今天就来研究一下传参对象里包含list<T>,且 list 的值与库里无映射
需求样例
List<T> [0,1,2,3] ----->[null,1,2,3]
当含有List含有0,in(0)必定查不出来 ,库里映射null
总之字段需要转化怎么处理?
修改库成本太大!
解决方案
方案一: 利用list.contains() 函数 泛型一致,不然判断不生效
<if test="paramInfo.markIds != null and paramInfo.markIds.size > 0">
<choose>
<when test="paramInfo.markIds.contains(0L)">
and (mark_id is null or mark_id in
<foreach collection="paramInfo.markIds" item="markId" open="(" separator="," close=")">
#{markId }
</foreach>
)
</when>
<otherwise>
and mark_id in
<foreach collection="paramInfo.markIds" item="markId" open="(" separator="," close=")">
#{markId}
</foreach>
</otherwise>
</choose>
</if>
方案二:
对象加额外字段markZero
利用用Java代码处理,当包含值时存入该字段
对于sql语句做双重判断
<if test="paramInfo.markIds != null and paramInfo.markIds.size > 0">
<choose>
<when test="paramInfo.markZero==0">
and (mark_id is null or mark_id in
<foreach collection="paramInfo.markIds" item="markId" open="(" separator="," close=")">
#{markId }
</foreach>
)
</when>
<otherwise>
and mark_id in
<foreach collection="paramInfo.markIds" item="markId" open="(" separator="," close=")">
#{markId}
</foreach>
</otherwise>
</choose>
</if>