如何将Jaspersoft Studio输入控件参数传递给Java Bean集合数据源
Jasper Reports 报表参数传递到Java Bean数据源实现方案
完全可以实现该需求,按以下步骤操作即可:
步骤1:改造Java工厂类
修改EmployeeFactory,新增支持传入过滤参数的静态方法,同时改用预编译SQL避免SQL注入,改造后的代码示例如下:
public class EmployeeFactory { static final String DB_URL = "jdbc:mysql://localhost:3306/jasper"; static final String USER = "root"; static final String PASS = "root"; // 替换为带占位符的过滤SQL static final String FILTER_QUERY = "SELECT name,salary FROM Employees WHERE salary > ?"; // 新增带过滤参数的静态方法 public static Collection<Employee> getFilteredCollection(Double salaryThreshold) { List<Employee> result = new ArrayList<>(); try( Connection connection = DriverManager.getConnection(DB_URL, USER, PASS); PreparedStatement pstmt = connection.prepareStatement(FILTER_QUERY) ){ // 给SQL占位符赋值 pstmt.setDouble(1, salaryThreshold); ResultSet resultSet = pstmt.executeQuery(); while(resultSet.next()) { Employee employee = new Employee( resultSet.getString("name"), resultSet.getDouble("salary"), "" ); result.add(employee); } }catch (SQLException e) { e.printStackTrace(); } return result; } }
修改完成后重新将Java项目打包为jar包,更新Jasper项目类路径下的旧jar文件。
步骤2:在Jasper报表中定义输入参数
打开你的jrxml报表文件,新建一个报表参数:
- 参数名:
SALARY_THRESHOLD - 参数类型:
java.lang.Double - 勾选「用作提示」选项,运行报表时就会自动弹出输入控件供用户填写阈值。
步骤3:配置报表数据源调用逻辑
默认的「Collection of JavaBeans」数据适配器不支持直接传递参数给工厂方法,推荐直接通过报表数据源表达式调用自定义工厂方法,操作如下:
在报表属性的「数据源」配置项中,选择「使用表达式创建数据源」,填入以下表达式:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(com.yourpackage.EmployeeFactory.getFilteredCollection($P{SALARY_THRESHOLD}))
注意将com.yourpackage替换为你EmployeeFactory类实际的包路径。
完成以上配置后,运行报表时输入薪资阈值,就会自动将参数传递给Java工厂类执行过滤查询,返回符合条件的数据填充报表。
内容的提问来源于stack exchange,提问作者chaitanya guruprasad
相关产品推荐
相关产品推荐

