首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Jasper报表中将SQL查询作为参数正确传递?

如何在Jasper报表中将SQL查询作为参数正确传递?
EN

Stack Overflow用户
提问于 2017-07-05 15:14:31
回答 1查看 5.3K关注 0票数 0

我已经研究了有关这个主题的所有其他问题,并遵循了其中提到的所有步骤,但是,当我试图将整个SQL语句作为参数传递时,仍然会出现错误。

这是我的SQLQuery参数:

代码语言:javascript
运行
复制
<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查询,所以需要通过一个参数传递它们。有人知道我错过了什么吗?

我尝试在queryString/使用$P{SQLTag}$P!{SQLTag}表达式

堆栈跟踪:

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-05 19:02:52

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

例如:

代码语言:javascript
运行
复制
<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>

或者像这样:

代码语言:javascript
运行
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44930093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档