Skip to content

查询示例

本文介绍 XML 配置示例,可通过 XML 配置动态生成安全、可扩展的 SQL 查询语句,适用于通用查询接口等场景。

💡 以下配置为方便接口测试都关闭了 必须登录 校验 login="false"

测试用数据

单表查询

  • 说明: 从一张表中查询数据。例:从用户表中查询用户数据。

示例sql:

sql
# 从 test_user 查询用户数据
select testUser.id          as id,
       testUser.create_time as createTime,
       testUser.update_time as updateTime,
       testUser.deleted     as deleted,
       testUser.tenant_id   as tenantId,
       testUser.username    as username,
       testUser.nickname    as nickname,
       testUser.email       as email
from test_user as testUser

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户表" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testUser -->
  <MainTable id="testUser" table="test_user">
    <!-- 配置查询字段 id为字段名, name为属性名(字段别名),comment为字段描述 -->
    <QueryField comment="主键" id="id" name="id"/>
    <QueryField comment="创建时间" id="create_time" name="createTime"/>
    <QueryField comment="更新时间" id="update_time" name="updateTime"/>
    <QueryField comment="是否删除" id="deleted" name="deleted"/>
    <QueryField comment="租户编号" id="tenant_id" name="tenantId"/>
    <QueryField comment="用户名" id="username" name="username"/>
    <QueryField comment="昵称" id="nickname" name="nickname"/>
    <QueryField comment="邮箱" id="email" name="email"/>
  </MainTable>
</QueryDomain>

数据json

json
{
  "deleted": false,
  "createTime": 1763214396000,
  "tenantId": 1,
  "nickname": "张三",
  "updateTime": 1763214396000,
  "id": 1,
  "email": "zhangsan@example.com",
  "username": "zhangsan"
}

接口查询测试

selectPage 分页查询

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/select-page

selectOne 单条查询

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/select-one

selectList 列表查询

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/select-list

selectCount 统计查询

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/select-count

export 数据导出

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/export

单表查询(查询条件配置)

  • 说明: 配置字段 symbols 启用查询支持,仅配置的符号支持查询,全部符号查看API定义
  • 示例: 配置id字段支持EQ和IN查询,<QueryField comment="主键" id="id" name="id" symbols="EQ,IN"/>

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户表" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testUser -->
  <MainTable id="testUser" table="test_user">
    <!-- 配置查询字段 symbols为字段支持的查询符号,多个用逗号分隔 -->
    <QueryField comment="主键" id="id" name="id" symbols="EQ,IN"/>
    <QueryField comment="创建时间" id="create_time" name="createTime"/>
    <QueryField comment="更新时间" id="update_time" name="updateTime"/>
    <QueryField comment="是否删除" id="deleted" name="deleted"/>
    <QueryField comment="租户编号" id="tenant_id" name="tenantId"/>
    <QueryField comment="用户名" id="username" name="username"/>
    <QueryField comment="昵称" id="nickname" name="nickname"/>
    <QueryField comment="邮箱" id="email" name="email"/>
  </MainTable>
</QueryDomain>

接口查询测试(以 selectList 接口为例)

查询用户ID为2的用户数据

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/select-list

请求参数:

json
{
  "whereParams": [
    {
      "name": "id",
      "symbol": "EQ",
      "value": 2
    }
  ]
}

查询用户ID为1和3的用户数据

测试接口:http://localhost:48080/admin-api/lowcode/deploy-api/testUser/select-list

请求参数:

json
{
  "whereParams": [
    {
      "name": "id",
      "symbol": "IN",
      "values": [1,3]
    }
  ]
}

主表配置:

多表查询

  • 说明: 对于存在多表关联关系的情况,通过 QueryTable 配置关联查询
  • 示例: 查询订单用户昵称和积分发放明细,由于订单表中仅存有用户ID,需要关联用户表查询用户昵称,根据订单ID关联积分变动表查询积分变动值和变动原因

示例sql:

sql
select testOrder.id                   as id,
       testOrder.order_no             as orderNo,
       testOrder.total_amount         as totalAmount,
       testUser.nickname              as nickname,
       testPointsRecord.points_change as pointsChange,
       testPointsRecord.reason        as reason
from test_order as testOrder
join test_user as testUser on testUser.id = testOrder.user_id
left join test_points_record as testPointsRecord on testOrder.id = testPointsRecord.order_id

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户订单获取积分查询" login="false">
  <!-- 指定查询主表 test_order 并设定别名 testOrder -->
  <MainTable id="testOrder" table="test_order">
    <!-- 配置查询字段 -->
    <QueryField comment="订单id" id="id" name="id" symbols="EQ,IN"/>
    <QueryField comment="订单编号" id="order_no" name="orderNo"/>
    <QueryField comment="订单金额" id="total_amount" name="totalAmount"/>
  </MainTable>
  <!-- 关联用户表(join),查询用户昵称 -->
  <QueryTable id="testUser" table="test_user" joinOn="testUser.id = testOrder.user_id">
    <!-- 配置查询字段 -->
    <QueryField comment="昵称" id="nickname" name="nickname"/>
  </QueryTable>
  <!-- 关联积分明细表(left join),查询订单积分发放明细 -->
  <QueryTable id="testPointsRecord" table="test_points_record" leftJoinOn="testOrder.id = testPointsRecord.order_id">
    <!-- 配置查询字段 -->
    <QueryField comment="积分变动值" id="points_change" name="pointsChange"/>
    <QueryField comment="变动原因" id="reason" name="reason"/>
  </QueryTable>
</QueryDomain>

数据json:

json
{
  "totalAmount": 399.98,
  "reason": "下单获得积分",
  "orderNo": "ORD20251115001",
  "nickname": "张三",
  "pointsChange": 40,
  "id": 1
}

主表配置:

副表配置:

查询字段使用确权查询

  • 说明: 对应某些查询场景仅查询登录用户相关的数据,如仅查询自己创建的数据等。
  • 示例: 仅查询当前登录用户信息

💡参考 cn.iocoder.yudao.module.lowcode.querier.interceptor.QueryDomainAuthTypeInterceptor 拦截器实现,可根据需求自行扩展

确权类型

确权类型描述
authUserId字段按当前登录用 id 查询

示例sql:

sql
select testUser.id          as id,
       testUser.create_time as createTime,
       testUser.update_time as updateTime,
       testUser.deleted     as deleted,
       testUser.tenant_id   as tenantId,
       testUser.username    as username,
       testUser.nickname    as nickname,
       testUser.email       as email
from test_user as testUser
where 1 = 1 and (testUser.id = #{id})  limit 1;

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户表" login="true">
  <!-- 指定查询主表 test_user 并设定别名 testUser -->
  <MainTable id="testUser" table="test_user">
    <!-- 配置查询字段 symbols为字段支持的查询符号,多个用逗号分隔 -->
    <QueryField comment="主键" id="id" name="id" symbols="EQ,IN" authType="authUserId"/>
    <QueryField comment="创建时间" id="create_time" name="createTime"/>
    <QueryField comment="更新时间" id="update_time" name="updateTime"/>
    <QueryField comment="是否删除" id="deleted" name="deleted"/>
    <QueryField comment="租户编号" id="tenant_id" name="tenantId"/>
    <QueryField comment="用户名" id="username" name="username"/>
    <QueryField comment="昵称" id="nickname" name="nickname"/>
    <QueryField comment="邮箱" id="email" name="email"/>
  </MainTable>
</QueryDomain>

数据json:

json
{
  "deleted": false,
  "createTime": 1763214396000,
  "tenantId": 1,
  "nickname": "张三",
  "updateTime": 1763214396000,
  "id": 1,
  "email": "zhangsan@example.com",
  "username": "zhangsan"
}

主表配置:

查询字段使用函数

  • 说明: 对应某些查询字段需使用函数进行处理情况。
  • 示例: 根据用户邮箱分割,提前邮箱用户名部分和域名部分

示例sql:

sql
select testEmailSplit.id as id,
       (SUBSTRING_INDEX(testEmailSplit.email, '@', 1)) as username,
       (SUBSTRING_INDEX(testEmailSplit.email, '@', -1)) as domain
from test_user as testEmailSplit

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户邮箱拆分" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testEmailSplit -->
  <MainTable id="testEmailSplit" table="test_user">
    <!-- 配置查询字段 -->
    <QueryField comment="主键" id="id" name="id" symbols="EQ,IN"/>
    <!-- 使用函数处理 email 字段,提取用户名部分 -->
    <QueryField comment="邮箱用户名部分" name="username">
      SUBSTRING_INDEX(testEmailSplit.email, '@', 1)
    </QueryField>
    <!-- 使用函数处理 email 字段,提取域名部分 -->
    <QueryField comment="邮箱域名部分" name="domain">
      SUBSTRING_INDEX(testEmailSplit.email, '@', -1)
    </QueryField>
  </MainTable>
</QueryDomain>

数据json:

json
{
  "domain": "example.com",
  "id": 1,
  "username": "zhangsan"
}

主表配置:

查询字段使用子查询

  • 说明: 对应某些查询字段使用子查询进行处理情况。
  • 示例: 查询用户信息并统计下单次数和用户总积分

示例sql:

sql
select testUserOrderPoints.id as id,
       testUserOrderPoints.nickname as nickname,
       (SELECT COUNT(o.id) FROM test_order o WHERE o.user_id = testUserOrderPoints.id) as orderCount,
       (SELECT IFNULL(SUM(r.points_change), 0) FROM test_points_record r WHERE r.user_id = testUserOrderPoints.id) as pointsTotal
from test_user as testUserOrderPoints

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户统计信息" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testUserOrderPoints -->
  <MainTable id="testUserOrderPoints" table="test_user">
    <!-- 配置查询字段 -->
    <QueryField comment="主键" id="id" name="id" symbols="EQ,IN"/>
    <QueryField comment="用户昵称" id="nickname" name="nickname"/>
    <!-- 使用子查询从test_order表中查询下单次数 -->
    <QueryField comment="订单数量" name="orderCount">
        SELECT COUNT(o.id) FROM test_order o WHERE o.user_id = testUserOrderPoints.id
    </QueryField>
    <!-- 使用子查询从test_points_record表中查询用户总积分 -->
    <QueryField comment="总积分" name="pointsTotal">
        SELECT IFNULL(SUM(r.points_change), 0) FROM test_points_record r WHERE r.user_id = testUserOrderPoints.id
    </QueryField>
  </MainTable>
</QueryDomain>

数据json:

json
{
  "nickname": "张三",
  "orderCount": 2,
  "id": 1,
  "pointsTotal": 63
}

主表配置:

查询表使用子查询

  • 说明: 对应某些查询表需使用子查询进行处理情况。
  • 示例: 根据用户积分表

示例sql:

sql
select
    userPointsSummary.user_id as userId,
    userPointsSummary.total_points as totalPoints,
    testUser.nickname as nickname
from (
    SELECT r.user_id,
           SUM(r.points_change) AS total_points
      FROM test_points_record r
      GROUP BY r.user_id
) as userPointsSummary
join test_user as testUser on testUser.id = userPointsSummary.user_id

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户积分查询" login="false">
  <!-- 指定查询主表 从sql子查询 查询数据,关闭逻辑删除和多租户支持-->
  <MainTable id="userPointsSummary" table="test_user" disableLogicDelete="true" disableTenant="true">
    <!-- 子查询sql -->
    <QuerySql>
      SELECT r.user_id,max((r.tenant_id)) as tenant_id,SUM(r.points_change) AS total_points
      FROM test_points_record r
      GROUP BY r.user_id
    </QuerySql>
    <!-- 配置查询字段 -->
    <QueryField comment="用户ID" id="user_id" name="userId"/>
    <QueryField comment="总积分" id="total_points" name="totalPoints"/>
  </MainTable>
  <!-- 关联用户表 查询用户昵称 -->
  <QueryTable id="testUser" joinOn="testUser.id = userPointsSummary.user_id" table="test_user">
    <QueryField comment="昵称" id="nickname" name="nickname"/>
  </QueryTable>
</QueryDomain>

数据json:

json
{
  "totalPoints": 63,
  "nickname": "张三",
  "userId": 1
}

主表配置:

子查询中使用参数

  • 说明: 对应某些需使用子查询进行处理时需要根据查询参数过滤,避免全表扫描的情况。
  • 示例: 根据id查询用户积分表

示例sql:

sql
select
    userPointsSummary.user_id as userId,
    userPointsSummary.total_points as totalPoints,
    testUser.nickname as nickname
from (
    SELECT r.user_id,
           SUM(r.points_change) AS total_points
      -- 子查询中使用 #{userId} 指定参数,实际执行时会替换成对应的参数化字符串 #{userId_0},#{userId_1}
      FROM test_points_record r where r.user_id in (#{userId_0},#{userId_1})
      GROUP BY r.user_id
) as userPointsSummary
join test_user as testUser on testUser.id = userPointsSummary.user_id

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户积分查询" login="false">
  <!-- 指定查询主表 从sql子查询 查询数据,关闭逻辑删除和多租户支持-->
  <MainTable id="userPointsSummary" table="test_user" disableLogicDelete="true" disableTenant="true">
    <!-- 子查询sql -->
    <QuerySql>
      SELECT r.user_id,max((r.tenant_id)) as tenant_id,SUM(r.points_change) AS total_points
      <!-- 子查询使用 #{userId} 参数过滤 -->
      FROM test_points_record r where r.user_id in (#{userId})
      GROUP BY r.user_id
    </QuerySql>
    <!-- 配置查询字段 -->
    <QueryField comment="用户ID" id="user_id" name="userId" symbols="EQ,IN"/>
    <QueryField comment="总积分" id="total_points" name="totalPoints"/>
  </MainTable>
  <!-- 关联用户表 查询用户昵称 -->
  <QueryTable id="testUser" joinOn="testUser.id = userPointsSummary.user_id" table="test_user">
    <QueryField comment="昵称" id="nickname" name="nickname"/>
  </QueryTable>
</QueryDomain>

数据json:

json
{
  "totalPoints": 130,
  "nickname": "李四",
  "userId": 2
}

子查询配置:

查询表动态生效

  • 说明: 对应某些查询场景仅在用户传入特定查询条件时才关联相关数据表。
  • 示例: 根据type查询用户信息,type = 1 仅查询用户数据, type = 2 总积分 type = 3 总积分+订单数

示例sql:

sql
# 仅查询用户数据
select testUser.id as id, testUser.nickname as nickname from test_user as testUser

# 查询用户数据+总积分
select testUser.id as id, testUser.nickname as nickname, pointsStat.total_points as totalPoints
from test_user as testUser
left join (
    SELECT r.user_id, SUM(r.points_change) AS total_points from test_points_record r where r.user_id in (#{id}) GROUP BY r.user_id
) as pointsStat on pointsStat.user_id = testUser.id


# 查询用户数据+总积分+订单数
select testUser.id             as id,
       testUser.nickname       as nickname,
       pointsStat.total_points as totalPoints,
       orderStat.order_cnt     as orderCnt
from test_user as testUser
left join (
    SELECT r.user_id, SUM(r.points_change) AS total_points from test_points_record r where r.user_id in (#{id}) GROUP BY r.user_id
) as pointsStat on pointsStat.user_id = testUser.id 
left join (
    SELECT o.user_id, count (o.id) AS order_cnt from test_order o where o.user_id in (#{id}) GROUP BY o.user_id
) as orderStat on orderStat.user_id = testUser.id

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户信息分类查询" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testUser -->
  <MainTable id="testUser" table="test_user">
    <!-- 配置查询字段 -->
    <QueryField comment="主键" id="id" name="id" symbols="EQ,IN"/>
    <QueryField comment="昵称" id="nickname" name="nickname"/>
  </MainTable>
  <!-- 用户总积分信息,当type > 1 时才关联此表,关闭逻辑删除和多租户支持 -->
  <QueryTable desc="用户总积分" disableLogicDelete="true" disableTenant="true" id="pointsStat" leftJoinOn="pointsStat.user_id = testUser.id">
    <!-- 子查询sql -->
    <QuerySql>
      SELECT r.user_id, SUM(r.points_change) AS total_points from test_points_record r where r.user_id in (#{id}) GROUP BY r.user_id
    </QuerySql>
    <!-- 表生效验证,GraalJS 函数代码,返回true代表该表配置本次查询有效 -->
    <!-- 也可配置 实现 cn.iocoder.yudao.module.lowcode.querier.valid.QueryDomainValidTest 接口的 Spring Bean Class Name  -->
    <ValidTestValue>
      /** 返回true代表该表配置本次查询有效 */
      if($params &amp;&amp; $params.getWhereParams()) {
          return $params.getWhereParams().some(e =&gt; e.getName() == 'type' &amp;&amp; e.getValue() &gt; 1)
      }
      return false
    </ValidTestValue>
    <!-- 配置查询字段 -->
    <QueryField comment="总积分" id="total_points" name="totalPoints"/>
  </QueryTable>
  <!-- 用户订单数信息,当type > 2 时才关联此表,关闭逻辑删除和多租户支持 -->
  <QueryTable desc="用户订单数" disableLogicDelete="true" disableTenant="true" id="orderStat" leftJoinOn="orderStat.user_id = testUser.id">
    <!-- 子查询sql -->
    <QuerySql>
      SELECT o.user_id, count(o.id) AS order_cnt from test_order o where o.user_id in (#{id}) GROUP BY o.user_id
    </QuerySql>
    <!-- 表生效验证,GraalJS 函数代码,返回true代表该表配置本次查询有效 -->
    <!-- 也可配置 实现 cn.iocoder.yudao.module.lowcode.querier.valid.QueryDomainValidTest 接口的 Spring Bean Class Name  -->
    <ValidTestValue>
      /** 返回true代表该表配置本次查询有效 */
      if($params &amp;&amp; $params.getWhereParams()) {
          return $params.getWhereParams().some(e =&gt; e.getName() == 'type' &amp;&amp; e.getValue() &gt; 2)
      }
      return false
    </ValidTestValue>
    <!-- 配置查询字段 -->
    <QueryField comment="总订单数" id="order_cnt" name="orderCnt"/>
  </QueryTable>
</QueryDomain>

数据json:

type = 1 仅查询用户数据

请求参数:

json
{
  "whereParams": [
    {
      "name": "id",
      "symbol": "EQ",
      "value": 1
    },
    {
      "name": "type",
      "symbol": "EQ",
      "value": 1
    }
  ]
}

响应:

json
{
    "code": 0,
    "msg": "",
    "data": {
        "nickname": "张三",
        "id": 1
    }
}

type = 2 查询用户数据 + 总积分

请求参数:

json
{
  "whereParams": [
    {
      "name": "id",
      "symbol": "EQ",
      "value": 1
    },
    {
      "name": "type",
      "symbol": "EQ",
      "value": 2
    }
  ]
}

响应:

json
{
    "code": 0,
    "msg": "",
    "data": {
        "nickname": "张三",
        "totalPoints": 63,
        "id": 1
    }
}

type = 3 仅查询用户数据 + 总积分 + 订单数

请求参数:

json
{
  "whereParams": [
    {
      "name": "id",
      "symbol": "EQ",
      "value": 1
    },
    {
      "name": "type",
      "symbol": "EQ",
      "value": 3
    }
  ]
}

响应:

json
{
    "code": 0,
    "msg": "",
    "data": {
        "nickname": "张三",
        "totalPoints": 63,
        "orderCnt": 2,
        "id": 1
    }
}

查询副表配置

配置默认查询条件

  • 说明: 对应某些查询场景需要默认设置查询条件的场景。
  • 示例: 仅允许查询 id 在 (1, 2) 范围内的用户数据

示例sql:

sql
select testUser.id          as id,
       testUser.create_time as createTime,
       testUser.update_time as updateTime,
       testUser.deleted     as deleted,
       testUser.tenant_id   as tenantId,
       testUser.username    as username,
       testUser.nickname    as nickname,
       testUser.email       as email
from test_user as testUser
where testUser.id in (1, 2)

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户表" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testUser -->
  <MainTable id="testUser" table="test_user">
    <!-- 配置查询字段 symbols为字段支持的查询符号,多个用逗号分隔 -->
    <QueryField comment="主键" id="id" name="id" symbols="EQ,IN"/>
    <QueryField comment="创建时间" id="create_time" name="createTime"/>
    <QueryField comment="更新时间" id="update_time" name="updateTime"/>
    <QueryField comment="是否删除" id="deleted" name="deleted"/>
    <QueryField comment="租户编号" id="tenant_id" name="tenantId"/>
    <QueryField comment="用户名" id="username" name="username"/>
    <QueryField comment="昵称" id="nickname" name="nickname"/>
    <QueryField comment="邮箱" id="email" name="email"/>
  </MainTable>
  <QueryWhere>
      <!-- 配置默认查询条件 -->
      testUser.id in (1,2)
  </QueryWhere>
</QueryDomain>

数据json:

json
{
  "deleted": false,
  "createTime": 1763214396000,
  "tenantId": 1,
  "nickname": "张三",
  "updateTime": 1763214396000,
  "id": 1,
  "email": "zhangsan@example.com",
  "username": "zhangsan"
}

查询 id 为3的用户数据

查询过滤器使用

  • 说明: 处理某些查询场景需要对查询参数进行校验的情况。
  • 示例: 按创建时间查询订单,查询时间范围不能超过7天。

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-订单表" login="false">
  <!-- 指定查询主表 test_order 并设定别名 testOrder -->
  <MainTable id="testOrder" table="test_order">
    <!-- 配置查询字段 -->
    <QueryField comment="主键" id="id" name="id"/>
    <QueryField comment="用户ID" id="user_id" name="userId"/>
    <QueryField comment="创建时间" id="create_time" name="createTime" required="true" symbols="BETWEEN"/>
    <QueryField comment="更新时间" id="update_time" name="updateTime"/>
    <QueryField comment="是否删除" id="deleted" name="deleted"/>
    <QueryField comment="租户编号" id="tenant_id" name="tenantId"/>
    <QueryField comment="订单编号" id="order_no" name="orderNo"/>
    <QueryField comment="订单总金额" id="total_amount" name="totalAmount"/>
  </MainTable>
  <!-- 查询过滤器配置 -->
  <QueryFilter>
    <!-- 查询过滤器,GraalJS 函数代码,返回 undefined 代表本次校验通过 -->
    <!-- 也可配置 实现 cn.iocoder.yudao.module.lowcode.querier.filter.QueryDomainFilter 接口的 Spring Bean Class Name  -->
    <QueryFilterValue>
      /** 校验不通过返回错误信息, 否则校验通过 */
      /** 使用 QueryDomainUtils 工具类 */
      const QueryDomainUtils = Java.type('cn.iocoder.yudao.module.lowcode.querier.utils.QueryDomainUtils');
      /** 使用 hutool 工具类 */
      const DateUtil = Java.type('cn.hutool.core.date.DateUtil');
      const DateUnit = Java.type('cn.hutool.core.date.DateUnit');

      const createTimeParam = QueryDomainUtils.getWhere($params, 'createTime');
      if (createTimeParam) {
          const values = createTimeParam.getValues(); // 使用 getter 获取 values

          if (!values || values.size() !== 2) {
              return '创建时间参数必须包含开始时间和结束时间';
          }

          const startTimeStr = values.get(0);
          const endTimeStr = values.get(1);

          if (!startTimeStr || !endTimeStr) {
              return '创建时间的开始时间和结束时间不能为空';
          }

          try {
              const startDate = DateUtil.parse(startTimeStr);
              const endDate = DateUtil.parse(endTimeStr);

              if (startDate.after(endDate)) {
                  return '创建时间:开始时间不能晚于结束时间';
              }

              const betweenDay = DateUtil.between(startDate, endDate, DateUnit.DAY);

              if (betweenDay &gt; 7) {
                  return '创建时间查询范围不能超过7天';
              }

          } catch (e) {
              return '创建时间格式错误,应为 yyyy-MM-dd HH:mm:ss';
          }
      }
    </QueryFilterValue>
  </QueryFilter>
</QueryDomain>

查询过滤器配置

测试过滤器校验

查询拦截器使用

  • 说明: 处理某些查询场景需要对查询参数进行前处理和对查询结果进行后处理的情况。
  • 示例: 按用户名查询用户信息,使用拦截器对查询值全部转为小写, 对查询结果将email进行掩码处理。

示例xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 方便测试关闭了 必须登录 校验 -->
<QueryDomain desc="测试-用户表" login="false">
  <!-- 指定查询主表 test_user 并设定别名 testUser -->
  <MainTable id="testUser" table="test_user">
    <!-- 配置查询字段 id为字段名, name为属性名(字段别名),comment为字段描述 -->
    <QueryField comment="主键" id="id" name="id"/>
    <QueryField comment="创建时间" id="create_time" name="createTime"/>
    <QueryField comment="更新时间" id="update_time" name="updateTime"/>
    <QueryField comment="是否删除" id="deleted" name="deleted"/>
    <QueryField comment="租户编号" id="tenant_id" name="tenantId"/>
    <QueryField comment="用户名" id="username" name="username" required="true" symbols="EQ"/>
    <QueryField comment="昵称" id="nickname" name="nickname"/>
    <QueryField comment="邮箱" id="email" name="email"/>
  </MainTable>
  <QueryInterceptor>
  <QueryInterceptorValue>
    <QueryInterceptorPreHandleValue>
        /** 前处理, 查询前对参数预处理, 返回处理后的参数 */
        const QueryDomainUtils = Java.type('cn.iocoder.yudao.module.lowcode.querier.utils.QueryDomainUtils');
        const usernameParam = QueryDomainUtils.getWhere($params, 'username');
        if (usernameParam) {
            const value = usernameParam.getValue();
            usernameParam.setValue(value.toLowerCase());
        }
        return $params;
    </QueryInterceptorPreHandleValue>

    <QueryInterceptorPostHandleValue>
        /** 后处理, 查询后对结果后处理, 返回处理后的结果 */
        const DesensitizedUtil = Java.type('cn.hutool.core.util.DesensitizedUtil');
        $results.forEach(row =&gt; {
            if(row['email']) {
                row['email'] = DesensitizedUtil.email(row['email'].toString());
            }
        })
        return $results;
    </QueryInterceptorPostHandleValue>
  </QueryInterceptorValue>
</QueryInterceptor>
</QueryDomain>

查询拦截器配置

测试查询拦截器