首页 > 解决方案 > 在 MyBatis 中使用 `where 1=2` 查询空列表是一个好习惯吗?

问题描述

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

有一个清单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不能为空,否则会变成SELECT * FROM table1 where id in ()SQL 并且 SQL 会抛出异常。

为了在list为空或为空时返回空记录,我更改了where 1=2用于使 sql 返回空的 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。使用它是一个好习惯吗?有没有其他方法可以解决我的问题?

标签: sqlmybatis

解决方案


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

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


推荐阅读