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

如何在Java中传递参数给SQL查询以生成Jasper Report

Java传递参数到Jasper Report的SQL查询(subDataset场景)

完全可以实现从Java代码传递参数到Jasper Report的SQL查询,下面是具体的修改步骤和代码示例:

1. 修改JRXML中的subDataset配置

需要先在subDataset里定义参数,然后在SQL查询中引用这个参数:

<subDataset name="userDataset" uuid="b277feac-f289-4d08-83ad-06eb2f992cb7">
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="userAdapater"/>
    <!-- 定义参数,参数名与后续Java代码传入的key一致,类型对应Java的String -->
    <parameter name="CityParam" class="java.lang.String"/>
    <queryString language="SQL">
        <![CDATA[SELECT * FROM users where city = $P{CityParam}]]>
    </queryString>
</subDataset>

说明:$P{参数名}是Jasper Report的参数引用语法,会自动处理SQL注入问题,比直接拼接字符串更安全。

2. Java代码中传递参数并生成报表

在Java代码里,把参数放入Map中,再传递给报表填充方法:

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;

public class JasperReportGenerator {
    public static void main(String[] args) {
        try {
            // 加载JRXML报表文件
            File reportFile = new File("path/to/your/report.jrxml");
            JasperReport jasperReport = JasperCompileManager.compileReport(reportFile.getAbsolutePath());

            // 准备要传递的参数
            Map<String, Object> parameters = new HashMap<>();
            // 参数名必须和JRXML中定义的一致
            parameters.put("CityParam", "Washington");

            // 获取MySQL数据库连接(替换为你的实际配置)
            String dbUrl = "jdbc:mysql://localhost:3306/your_database";
            String dbUser = "your_db_user";
            String dbPwd = "your_db_password";
            Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);

            // 填充报表
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);

            // 导出为PDF示例
            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("output/report.pdf"));
            exporter.exportReport();

            // 关闭资源
            conn.close();
            System.out.println("报表生成完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

额外注意事项

如果你的主报表是通过datasetRun引用这个subDataset,需要在datasetRun标签中传递参数,确保主报表参数能传递到subDataset:

<datasetRun subDataset="userDataset" uuid="...">
    <datasetParameter name="CityParam">
        <datasetParameterExpression><![CDATA[$P{CityParam}]]></datasetParameterExpression>
    </datasetParameter>
</datasetRun>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:02:42