我们正在寻找一种更强大的方法来收集和处理我们报告中要处理的数据。对于大型数据库的一个高级报告,我们需要运行两个独立的SQL查询(在同一数据源上)并在之后将它们组合起来。
Query1返回:
user id#1 ... 3 columns
user id#2 ... 3 columns
user id#4 ... 3 columns
查询2返回:
user id#1 ... 5 columns
user id#3 .. 5 columns
user id#4 ... 5 columns
我们想要展示的内容:
user id#1 ... 3 columns + 5 columns
user id#2 ... 3 columns
user id#3 ... 5 columns
user id#4 ... 3 columns + 5 columns
虽然这是违反直觉的,但我们发现在SQL中组合两个查询的结果会导致SQL查询的运行时间显着变差。
我们已经查看了子数据集,但根据我的理解,不可能在一个表中混合来自两个子数据集(或主数据+一个子数据集)的数据。
我们已经查看了子报表,但是根据我的理解,如果我按照我们的意图将子报表放在Details区域中,子报表将为报表中的每一行调用一次查询。但出于性能原因,我们希望运行我们准备的两个查询,每个查询只运行一次。
我们认为最合理的方法是让我们用Java编写这样的高级报告,并且它是可能的,但是JavaBean数据源无法访问报告参数。我们的数据库非常庞大,因此我们不能在没有位置的情况下进行查询并在之后进行过滤,Java代码需要访问报告参数。
我们目前正在研究实现JRQueryExecutor as recommended there和there (last comment),甚至利用scriptlet。
但听起来真的很先进,我们想知道我们是在想错路还是走向错误的方向?如果JRQueryExecutor是正确的方式,欢迎任何示例或文档。
我们也在考虑重构我们的SQL以只用一个查询来实现结果,但我们确实认为报告系统应该允许我们用Java来操作数据。
答案 0 :(得分:1)
最后我们使用了一个scriptlet。在afterReportInit
中,继承JRDefaultScriptlet
,您可以从parametersMap
获取参数和数据源,然后您可以从Java填写数据源。