碧玉报告中的动态查询

Dynamic query in jasper reports

我们正在使用 jaspersoft studio 创建报告,但我卡在了查询部分。 从逻辑上讲,我想要的查询类型是:

select * from mytable where
                    IF (condition1)
                              raw_sql_part_1
                    ELSE
                              raw_sql_part_2

所以现在为了在 "Query editor dialog" 中实现这一点,我写道:

select * from mytable where $P!{param1}

并在表达式编辑器中添加了 "param1" 默认值:

"$P{param2}.equals("A") ?  "1 <> 1" :"1=1" , is 'For prompting' as false

还在参数列表中添加了 "param2",其中 'is for prompting' 为 true

我希望这样: 当我点击预览时,它会提示我输入 param2 值,然后基于 param2 解决 param1 中的条件,然后最终在实际查询中替换它。 param2 的默认值为空字符串。

实际情况: 当我点击预览时,它询问我预期的 param2 值,但是 param2 的值不用于解析 param1 中定义的条件,因为 param1 条件总是解析为其他部分,即“1==1”,主查询也变成了

select * from mytable where 1==1

Q1:我是不是期待错了?

Q2:为什么不使用param2来解析param1中定义的条件?

我们使用的是 Jaspersoft Studio 版本 6.1.1

实际上我不认为你可以根据另一个参数的值在一个参数上设置 defaultValueExpression,但是如果参数的顺序 似乎 可以工作在 jrxml 中是正确的。

例子

<parameter name="param1" class="java.lang.String">
    <defaultValueExpression><![CDATA["A"]]></defaultValueExpression>
</parameter>
<parameter name="param2" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA[$P{param1}.equals("A") ?  "1 <> 1" :"1=1"]]></defaultValueExpression>
</parameter>

有效,所以我的猜测是您没有按正确的顺序定义参数。

注:

select * from mytable where $P{param1},将尝试使用预处理语句

jasper 报告中的查询可以使用带有准备好的语句的参数或简单的字符串替换来执行。

  • $P{param} --> 准备语句

  • $P!{param} --> 字符串替换

从你的例子来看,查询应该是字符串替换

select * from mytable where $P!{param1}

有关详细信息,请参阅此内容:JasperReports: Passing parameters to query