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
相关产品推荐
相关产品推荐

