You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JasperSoft使用JSONQL创建数据集为空问题求助

问题分析与修正方案

你的问题出在JSONQL过滤表达式的写法错误,导致无法正确定位目标数据,以下是具体修正步骤:

1. 修正subDataSource表达式

原表达式试图直接在verifica对象上过滤,但prestazioni_a_confronto是数组结构,需要先筛选数组中满足条件的元素,再定位到verifica对象。将表达式修改为:

((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("prestazioni_a_confronto[verifica.tipologia == 'M']")

该表达式的作用是:从主数据源中取出prestazioni_a_confronto数组,过滤出其中verifica.tipologia等于'M'的元素,作为子数据集的数据源。

2. 修正subDataset的JSONQL查询与字段配置

由于子数据源已经是过滤后的prestazioni_a_confronto元素,需要调整查询语句以匹配数据结构:

  • 修改<queryString>内容:
<queryString language="jsonql">
    <![CDATA[verifica]]>
</queryString>
  • 字段配置保持不变即可,此时当前数据对象为verifica,codice字段可直接对应其属性。

可选替代方案(直接在subDataset中完成过滤)

如果不想修改subDataSource表达式,也可以直接在subDataset的JSONQL中完成完整的定位与过滤:

<queryString language="jsonql">
    <![CDATA[prestazioni_a_confronto[verifica.tipologia == 'M'].verifica]]>
</queryString>

这种情况下,subDataSource表达式可简化为直接传递数组:

((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("prestazioni_a_confronto")

关键说明

JSONQL中,数组过滤需使用[条件]语法,而非直接在子对象后加(条件)。原写法prestazioni_a_confronto.verifica(tipologia == 'M')会被解析为调用verifica方法并传入参数,而非过滤属性,这就是数据集为空的核心原因。

内容的提问来源于stack exchange,提问作者bany

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:35:23