【问题标题】:How to correctly pass a SQL query as parameter in Jasper Reports?如何在 Jasper Reports 中正确传递 SQL 查询作为参数?
【发布时间】:2017-07-05 15:14:31
【问题描述】:

我已经查看了有关此主题的所有其他问题,并按照其中提到的所有步骤进行操作,但是在尝试将整个 SQL 语句作为参数传递时仍然出现错误。

这是我的 SQLQuery 参数:

<parameter name="SQLTag" class="java.lang.String">
    <defaultValueExpression><![CDATA["SELECT * FROM REPORT_VER WHERE TAG BETWEEN  $P{Von}  AND $P{Bis}"]]></defaultValueExpression>
</parameter>

我已经检查过了,当直接传递到 Report SQL 字段时,SQL 工作得非常好。 但是,因为我想要有条件的 SQL 查询,我需要它们通过参数传递。有人知道我错过了什么吗?

我尝试在 queryString/

中使用 $P{SQLTag}$P!{SQLTag} 表达式

堆栈跟踪:

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.JRException: Error executing SQL statement for: Abnahme.
    at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:548)
    at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$20(ReportControler.java:523)
    at com.jaspersoft.studio.editor.preview.view.control.ReportControler$5.run(ReportControler.java:404)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Caused by: net.sf.jasperreports.engine.JRException: Error executing SQL statement for: Abnahme.
    at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:344)
    at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1245)
    at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:723)
    at net.sf.jasperreports.engine.fill.BaseReportFiller.setParameters(BaseReportFiller.java:438)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:550)
    at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFill.run(BaseFillHandle.java:123)

【问题讨论】:

    标签: sql parameters jasper-reports


    【解决方案1】:

    如果在 defaultValueExpression 中使用参数,您应该将它们作为通用 Java 变量进行操作。

    例如:

    <parameter name="fieldFilter" class="java.lang.String">
        <defaultValueExpression><![CDATA["someValue"]]></defaultValueExpression>
    </parameter>
    <parameter name="query" class="java.lang.String">
        <defaultValueExpression><![CDATA["SELECT * FROM some_table WHERE some_field = '" + $P{fieldFilter} + "'"]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[$P!{query}]]>
    </queryString>
    

    或者像这样:

    <parameter name="intFieldFilter" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[2017]]></defaultValueExpression>
    </parameter>
    <parameter name="strFieldFilter" class="java.lang.String">
        <defaultValueExpression><![CDATA["someValue"]]></defaultValueExpression>
    </parameter>
    <parameter name="query" class="java.lang.String">
        <defaultValueExpression><![CDATA[String.format("SELECT * FROM some_table WHERE some_field = '%1$s' AND trunc(date_field, 'yyyy') = trunc(to_date(%2$d, 'yyyy'), 'yyyy')", $P{strFieldFilter}, $P{intFieldFilter})]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[$P!{query}]]>
    </queryString>
    

    【讨论】:

    • 是的,我已将参数更改为 &lt;parameter name="SQLTag" class="java.lang.String" isForPrompting="false"&gt; &lt;defaultValueExpression&gt;&lt;![CDATA["SELECT * FROM REPORT_VER WHERE TAG BETWEEN '" + $P{Von} + "' AND '" + $P{Bis} + "'"]]&gt;&lt;/defaultValueExpression&gt; &lt;/parameter&gt; 仍然得到相同的结果...
    • $P{Von}$P{Bis} 都是 java.util.Date 是的,它工作得非常好,直接传递到 queryString 没有参数
    • 什么是带常量(不带参数)的有效 sql 查询?请张贴样品
    • "SELECT * FROM REPORT_VER WHERE TAG BETWEEN '10.05.2015' AND '20.05.2015'"
    • 表示需要将日期(Date)格式化为String(例如,借助SimpleDateFormat
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多