在我的Java项目中,我有很多带有复杂SQL查询的JasperReports报告,其中包含很多参数。这些报告用于生成包含查询返回的数据的pdf文档,并以各种方式进行分组和格式化。
现在我还需要直接导出查询结果(例如ResultSet,Map或csv文件,或类似的......)。 是否可以要求JasperReports仅执行查询并返回结果而不是呈现pdf页面?
(注意:它与为报表呈现选择csv输出格式不同,因为此方法尝试将报表设计转换为csv文件...相反,我只想“重用”查询在报告中,还利用JR参数管理等...)
这是我从报告中生成pdf文档的Java代码:
JasperReport report = (JasperReport) JRLoader.loadObject(inStream);
JasperPrint jasperprint = JasperFillManager.fillReport(report, params, conn);
JRAbstractExporter exporter = new JRPdfExporter();
exporter.exportReport();
ByteArrayOutputStream os = (ByteArrayOutputStream) exporter.getParameter(JRExporterParameter.OUTPUT_STREAM);
byte[] formattedReportBytes = os.toByteArray();
return formattedReportBytes;
我看到JasperReports中有一个名为JRJdbcQueryExecuter
的类......
是否可以直接调用它而不是调用fillReport
,以获取执行的SQL查询的ResultSet?
由于
答案 0 :(得分:7)
我想从这开始,这感觉错误和hacky,但它是可能的,减去实际上JasperReports执行查询。
JasperReport report = (JasperReport) JRLoader.loadObject(inStream);
//this is the actual query in the report
JRQuery query = report.getMainDataSet().getQuery;
//once here you get the entire sql string, this will have any parameters replaced with
//the '?' character
String queryString = query.getText();
//now start building your prepared statement, I am assuming you already have your
//connection in the conn variable
PrepararedStatment statement = con.prepareStatement(queryString);
//almost there, need to set the parameters
//the sql query is broke up into chunks inside the JRQuery. The chunks have types
//that are either text, parameter, or parameter clause. We care about parameter,
//not sure what parameter clause would be to be honest
int index = 0; //this is the index to set the parameter at in the statement
for (JRQueryChunk chunk : query.getChunks()){
if (chunk.getType() == JRQueryChunk .TYPE_PARAMETER){
statement.setObject(index, params.get(chunk.getText()));
index = index + 1;
}
}
//then execute the query
ResultSet results = statement.executeQuery();
注意:此处没有错误检查,您应该添加它。也不确定这样做是不是一个好主意。将查询从报告中移出并完全转移到Java代码中可能会更好。然后只需将ResultSet作为数据源传递,你就可以了。