SQL 查询中的动态字段过滤

这段代码是一个 SQL 查询中的动态字段过滤部分,使用了 MyBatis 的 标签和 标签。以下是逐步的解释:

java 复制代码
<!-- 动态字段过滤 -->
    <if test="parameters != null and parameters.size() > 0">
        <foreach collection="parameters" item="param" index="index" >
            <if test="param.columnsCode != null and param.searchValue != null">
                AND EXISTS (
                SELECT 1
                FROM JSON_TABLE(
                dynamic_fields,
                '$[*]' COLUMNS (
                columnsCode VARCHAR(255) PATH '$.columnsCode',
                value VARCHAR(255) PATH '$.value'
                )
                ) AS jt
                WHERE jt.columnsCode = #{param.columnsCode}
                AND jt.value LIKE CONCAT('%', #{param.searchValue}, '%')
                )
            </if>
        </foreach>
    </if>

1. 动态字段过滤判断

java 复制代码
<if test="parameters != null and parameters.size() > 0">

这部分检查 parameters 是否为空且大小大于 0,即 parameters

是一个非空的集合。只有在这个条件为真时,后续的过滤逻辑才会执行。

2. 循环遍历 parameters 集合

java 复制代码
<foreach collection="parameters" item="param" index="index">

这部分代码遍历 parameters 集合中的每个元素(每个元素被命名为 param)。 index 是当前遍历元素的索引,param

是当前元素。

3. 动态字段过滤条件判断

java 复制代码
<if test="param.columnsCode != null and param.searchValue != null">

这个 标签判断 param.columnsCode 和 param.searchValue 是否都不为空,只有在这两个字段都不为

null 时,才会应用该条件。

4. 构建查询条件

java 复制代码
AND EXISTS (
    SELECT 1
    FROM JSON_TABLE(
        dynamic_fields,
        '$[*]' COLUMNS (
            columnsCode VARCHAR(255) PATH '$.columnsCode',
            value VARCHAR(255) PATH '$.value'
        )
    ) AS jt
    WHERE jt.columnsCode = #{param.columnsCode}
    AND jt.value LIKE CONCAT('%', #{param.searchValue}, '%')
)
  1. AND EXISTS:这个条件判断是否存在符合特定条件的记录。EXISTS 会检查子查询是否返回结果。

  2. JSON_TABLE:这是MySQL 中的一个函数,用于将 JSON 数据转换成关系型表格形式。这里 dynamic_fields 应该是一个包含 JSON

    数据的列,$[*] 表示遍历 JSON 数组中的每个元素。 columnsCode 和 value:从 JSON 数据中提取字段

  3. columnsCode 和 value,并将其转换为关系型表的列。

  4. WHERE jt.columnsCode = #{param.columnsCode}:匹配 columnsCode 字段的值与传入参数 param.columnsCode 的值相等。

  5. AND jt.value LIKE CONCAT('%', #{param.searchValue}, '%'):使用 LIKE

    模糊查询匹配 value 字段中包含 param.searchValue 的值。

5. 结束标签

java 复制代码
</if>
</foreach>
</if>

这几个 和 标签用于结束前面相应的 if 和 foreach 标签。

6. DynamicSearchParam 类说明

java 复制代码
@Data
public class DynamicSearchParam {
    private String columnsCode;
    private String searchValue;
}

DynamicSearchParam 类是一个包含两个属性的 Java 类:

columnsCode:字段名,用来指定 JSON 数据中的某一列。 searchValue:搜索值,用来匹配 JSON 数据中

columnsCode 对应的字段值。 通过 @Data 注解(Lombok 提供的)自动生成了

getter、setter、toString()、equals()、hashCode() 方法。

7. parameters 列表

java 复制代码
private List<DynamicSearchParam> parameters;

parameters 是一个包含多个 DynamicSearchParam 对象的列表。每个 DynamicSearchParam对象包含了 columnsCode 和 searchValue,这些将被用来动态构建 SQL 查询条件。

总结:

parameters 是一个包含多个 DynamicSearchParam

对象的列表,每个对象指定了要搜索的字段(columnsCode)以及模糊搜索的值(searchValue)。
SQL 中的 会遍历 parameters 列表,为每个 DynamicSearchParam 对象生成一个 EXISTS子查询,查询 JSON 数据中是否包含指定的字段(columnsCode)和符合条件的(searchValue)。
这样可以实现动态过滤,根据不同的 columnsCode 和 searchValue 对 JSON 数据进行查询。

相关推荐
随风飘的云6 小时前
MySQL的慢查询优化解决思路
数据库
IvorySQL10 小时前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师11 小时前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
随逸17714 小时前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头15 小时前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
IvorySQL1 天前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData1 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
IvorySQL2 天前
PostgreSQL 技术日报 (3月5日)|规划器控制力升级,内核能力再进阶
数据库·postgresql·开源
数据组小组2 天前
免费数据库管理工具深度横评:NineData 社区版、Bytebase 社区版、Archery,2026 年开发者该选哪个?
数据库·测试·数据库管理工具·数据复制·迁移工具·ninedata社区版·naivicat平替