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

相关推荐
xiao-xiang4 小时前
redis-保姆级配置详解
数据库·redis
白鹭5 小时前
MySQL(多表查询练习)
数据库·mysql
吃掉你也没关系吧8 小时前
【postgresql】一文详解postgresql中的统计模块
sql·postgresql
xiao-xiang9 小时前
redis-sentinel基础概念及部署
数据库·redis·sentinel
AI 嗯啦9 小时前
SQL详细语法教程(三)mysql的函数知识
android·开发语言·数据库·python·sql·mysql
时序数据说10 小时前
国内时序数据库概览
大数据·数据库·物联网·时序数据库·iotdb
杰克尼11 小时前
mysql-条件查询案例
数据库·mysql
运维行者_13 小时前
使用Applications Manager进行 Apache Solr 监控
运维·网络·数据库·网络安全·云计算·apache·solr
昵称为空C15 小时前
SpringBoot 实现DataSource接口实现多租户数据源切换方案
后端·mybatis