sql - 在 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
。使用它是一个好习惯吗?有没有其他方法可以解决我的问题?
解决方案
处理此问题的更好方法是,如果已知查询将为空列表返回空结果集,则根本不执行查询。
这将为您节省往返数据库、执行查询(您已经知道其结果)和映射结果。
推荐阅读
- javascript - Angular 7 使用反应式表单进行动态表单验证
- typescript - TypeScript 升级到 3.7.2 后的表达式 expected.ts(1109)
- gradle - 如何使用 Kotlin DSL 定义 Gradle 项目属性
- dataframe - 为什么一行代码在评估时可以工作,但在运行时却不行
- adempiere - Adempiere 380 Webui 不显示进程错误消息和完整错误消息的弹出窗口
- sql - 在 MySQL 中选择列及其索引的输出是什么?
- python - 无法在 anaconda 环境中导入 opencv 和 dlib
- c - 将函数移动到具有共享函数和变量的单独文件
- .net - 无法从我的 .net MVC 应用程序使用 WCF 服务
- angular - 提前编译的 Angular 应用程序中的计算对象/映射/字典键