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 数据进行查询。

相关推荐
苦学编程的谢17 分钟前
MyBatis_3
java·开发语言·后端·mybatis
婪苏(Python学习ing)30 分钟前
MySQL 与 Redis 基础入门:从安装到核心操作
数据库
guojl31 分钟前
MyBatis最佳实践
后端·微服务·mybatis
幻灭行度1 小时前
通过redis_exporter监控redis cluster
数据库·redis·缓存
Wang's Blog1 小时前
Nestjs框架: 基于Mongodb的多租户功能集成和优化
数据库·mongodb·多租户
Edingbrugh.南空2 小时前
Aerospike架构深度解析:打造web级分布式应用的理想数据库
数据库·架构
技术卷3 小时前
详解力扣高频SQL50题之1084. 销售分析 III【简单】
sql·leetcode·oracle
小白的代码日记3 小时前
MyBatis-Plus 通用 Service
mybatis
Cxzzzzzzzzzz3 小时前
数据库索引详解:原理、设计原则与应用场景
数据库·mysql
Alla T4 小时前
【通识】数据库
数据库·oracle