news 2026/4/22 21:14:57

积木报表(JimuReport)URL 传多个 outId 查询多条:为什么 `IN (${outId})` 只生效第一个?以及正确做法(小白版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
积木报表(JimuReport)URL 传多个 outId 查询多条:为什么 `IN (${outId})` 只生效第一个?以及正确做法(小白版)

这个场景非常典型:报表页面用 URL 传参outId=7,8,SQL 写了o.id IN (${outId}),但预览只出来7的数据,没有8

下面我用“先复现 → 再解释原因 → 再给可落地方案”的方式,把它写成一篇完整教程。


1. 你的目标与现象

目标

在积木报表里让这类 SQL 支持多值查询:

...WHEREo.deleted=0ANDi.deleted=0ANDo.idIN(${outId})ORDERBYo.id,i.id

URL 传参类似:

/jmreport/view/xxx?token=...&tenantId=1&outId=7,8

现象

只查出了id=7的数据,id=8没出来。


2. 根因:${outId}在积木报表里常被当成“字符串”,导致 MySQL 只认到逗号前

积木报表 SQL 数据集的参数占位符常见写法是${参数名},并支持通过 URL 传参。([CSDN][1])

关键点在于:积木报表在解析参数时,经常把它当做“文本值”处理,最终 SQL 可能会变成类似这样(示意):

ANDo.idIN('7,8')

o.id是数字字段时,MySQL 会做隐式转换:
'7,8'转数字会被当成7(遇到逗号就截断),于是等价于:

ANDo.idIN(7)

所以你看到的结果就是:只有 7,没有 8


3. 为什么你写<foreach>会直接报错?

你写的这一段:

<foreach collection="outId"item="id"separator=",">#{id}</foreach>

这是MyBatis XML 动态 SQL语法,不是数据库 SQL 语法。

积木报表的SQL 数据集会把你输入的内容当成“纯 SQL 字符串”丢给数据库执行,数据库当然不认识<foreach>,于是报bad SQL grammar / SQLSyntaxErrorException这种语法错误(你日志里还出现了AND o.id IN AND o.id IN ( ),说明最终拼出来就是不合法 SQL)。


4. 你用FIND_IN_SET为什么能成功?

你最后改成:

ANDFIND_IN_SET(o.id,${outId})

它成功的本质原因是:

  • FIND_IN_SET(x, '7,8')这种写法,本来就是用来在“逗号分隔字符串列表”里找元素的;
  • 积木报表把${outId}当字符串后,很可能最终变成了:
FIND_IN_SET(o.id,'7,8')

于是o.id=7o.id=8都能匹配上。

这一招确实常被用作“积木报表 in 传参不生效”的 workaround(一些版本里更常见)。([CSDN][2])

⚠️ 但它也有明显缺点:基本用不上索引,数据量大时会慢(后面会说更推荐的写法)。


5. 推荐解法(强烈建议):用官方表达式函数DaoFormat.inNumber / DaoFormat.in

JimuReport 1.6.2+开始,官方文档明确提到:IN查询需要用函数来处理逗号分隔参数。([JimuReport][3])

5.1 数字 ID(比如 outId=7,8)✅推荐写法

ANDo.idIN(${DaoFormat.inNumber('${outId}')})
  • URL 继续传:outId=7,8
  • '${outId}'会得到字符串"7,8"
  • DaoFormat.inNumber(...)会把它转换成数值列表7, 8
  • 最终 SQL 变成真正的:
ANDo.idIN(7,8)

这才是**最标准、性能最好(可走索引)**的方式。

5.2 字符串类型(比如 code=AA,BB)

如果是字符串字段(需要带引号的那种),用DaoFormat.in(同一组函数体系)更合适,思路类似:把"AA,BB"变成('AA','BB')


6. 备选方案:继续用FIND_IN_SET(能用,但要知道代价)

如果你暂时不方便用DaoFormatFIND_IN_SET也能跑通,写法建议更稳一点(主动加引号,避免不同版本行为差异):

ANDFIND_IN_SET(o.id,'${outId}')

优点:简单粗暴,立刻可用。
缺点:大数据量时慢(通常不走索引)。([CSDN][2])


7. 另一个容易踩的坑:SQL 明明返回多行,但报表只显示 1 行?

如果你后面又遇到“SQL 在数据库执行有多行,但报表只渲染 1 行/空白行”的问题,多半是数据集类型填充方式配错了:

  • 数据集返回多行 → 你要按“集合”去渲染;
  • 积木报表里集合/对象在模板渲染上用法不同(常见提示:集合用#,对象用$,用错会出现空白行或只取第一条)。([JimuReport][4])

这个和你这次IN的问题是两条线,但经常一起出现。


8. 一套“遇到类似问题”的排查套路(新手可照抄)

  1. 先确认 URL 实际传进来了没
    在积木报表预览页看“参数面板/查询条件”是否能看到 outId 的值。

  2. 把参数替换后的 SQL 打出来看(最关键)
    你看到的LIMIT 1IN ('7,8')这类蛛丝马迹,就是定位问题的关键。

  3. 判断字段类型:数字还是字符串

  • 数字:优先DaoFormat.inNumber
  • 字符串:优先DaoFormat.in
  1. 实在不行再用FIND_IN_SET
    快速救火可以,但要考虑性能。

  2. 不要把 MyBatis 的<foreach>写进 SQL 数据集
    SQL 数据集不是 MyBatis XML。


9. 你这个报表的最终推荐 SQL(直接可用)

把你原 SQL 的这一段:

ANDo.idIN(${outId})

替换为(推荐):

ANDo.idIN(${DaoFormat.inNumber('${outId}')})

完整示例(仅展示 WHERE 相关):

WHEREo.deleted=0ANDi.deleted=0ANDo.idIN(${DaoFormat.inNumber('${outId}')})ORDERBYo.id,i.id

示例截图


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:09:34

为什么顶尖AI团队都在转向Open-AutoGLM?背后有这6个技术真相

第一章&#xff1a;Open-AutoGLM的起源与核心定位Open-AutoGLM 是一个面向自动化通用语言建模任务的开源框架&#xff0c;旨在降低大规模语言模型在复杂场景下的应用门槛。它由国内多个高校与研究机构联合发起&#xff0c;基于对 AutoGLM 架构的深度解耦与重构&#xff0c;实现…

作者头像 李华
网站建设 2026/4/23 10:11:20

为什么你的Open-AutoGLM跑不动?深度剖析配置不兼容的5大根源

第一章&#xff1a;Open-AutoGLM配置要求 Open-AutoGLM 是一个面向自动化自然语言任务的开源框架&#xff0c;依赖特定的软硬件环境以确保高效运行。为保障系统稳定性与推理性能&#xff0c;需严格遵循其配置规范。 系统环境要求 操作系统&#xff1a;Linux&#xff08;Ubunt…

作者头像 李华
网站建设 2026/4/23 15:47:34

AI测试工具投资决策手册:可量化ROI测算模型与高层说服策略

一、投资必要性论证框架 1.1 行业痛点与AI解决方案 传统测试瓶颈 AI工具应对能力 业务影响 重复用例执行耗时占比>60% 自动化脚本自生成 释放人力投入复杂场景测试 生产缺陷漏测率>35% 智能异常模式识别 降低线上故障损失30%-50% 跨平台兼容测试效率低 云化多…

作者头像 李华
网站建设 2026/4/23 10:11:24

Open-AutoGLM性能优化实战:3步实现推理效率提升300%

第一章&#xff1a;Open-AutoGLM原理框架Open-AutoGLM 是一个面向自动化自然语言生成与理解任务的开源大模型框架&#xff0c;融合了图神经网络&#xff08;GNN&#xff09;与大规模语言模型&#xff08;LLM&#xff09;的优势&#xff0c;旨在实现结构化知识与文本语义的深度融…

作者头像 李华