在MyBatis中使用`where 1 = 2`查询空列表是一个好习惯吗?

时间:2018-06-07 08:44:35

标签: sql mybatis

我经常从列表中查询记录列表。例如:

有一个列表list = [1, 2, 3];

和Mybatis中的SQL定义:

<select id="selectByIds" parameterType="java.util.List" resultType="...">
    SELECT * FROM table1
    WHERE id in
    <foreach collection="list" index="index" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</select>

list不应为空,否则SQL将变为SELECT * FROM table1 where id in (),SQL将抛出异常。

为了在list为空或空时返回空记录,我将SQL更改为使用where 1=2使sql返回为空。

<select id="selectByIds" parameterType="java.util.List" resultType="...">
    SELECT * FROM table1
    WHERE 
    <choose>
        <when test="list!=null and list.size()>0">
            id in
            <foreach collection="list" index="index" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </when>
        <otherwise>
            1=2
        </otherwise>
    </choose>
</select>

我关注where 1=2。使用它是一个好习惯吗?有没有其他方法可以解决我的问题?

2 个答案:

答案 0 :(得分:1)

处理此问题的更好方法是,如果已知查询将返回空列表的空结果集,则根本不执行查询。

这将节省您到数据库的往返,执行查询(您已经知道结果)和映射结果。

答案 1 :(得分:0)

在执行方法,功能和/或程序之前,应在之前检查 。否则只是随便调用它。