2011-06-27 149 views
1

我必须从我的应用程序生成报告, 首先用户选择他的搜索条件,然后他验证他的选择(搜索条件:图表类型,分组等等) 我的问题是:我怎样才能构建我的报告? 我的想法是:如何动态填写报告?

1 declar字符串SQL

2 - 当用户选中一个搜索条件,我会Concat的他选择了SQL请求 如:

SQL字符串; String select =“select”; String =“from”; String where; =“where” String and =“and”; String GroupBY =“Group by”;

时,他选择计算... GROUPBY数.... 我会Concat的: 选择=选择+ “COUNT(*)” 等

ALSO

我'使用了配置JPA/Hibernate所以我不使用从我的代码连接到数据库(我的意思是我不明确con =连接....),所以我应该传递给方法.fillReportToFile,runReportToPdfStream等

+0

方式太少了解答案。然而我要说的是,你迄今所说的话听起来像是SQL注入攻击的秘诀(http://en.wikipedia.org/wiki/SQL_injection)。 –

+0

为什么不直接找出用户可能进行的查询类型,然后尽可能多地对查询进行硬编码?例如,你可以让String count_query =“select count(1)from”,然后你可以处理count_query +“whatever_table_the_user_wants”,并且同样适用于其他查询?我还应该补充说,如果这不是一个内部应用程序,那么显然你需要做一些解析来防止SQL注入。 – 2011-06-27 16:03:13

+0

这只是一个想法,我没有尝试:) – rym

回答

0

I一般实现JRDataSource,并且在我的报告中根本不包含任何SQL。通过这种方式,您可以采用参数生成报告并将结果直接以受控方式提供给Jasper报告。

如果生成带有嵌入式子报告的报告,则可能仍需要提供连接。

/* Where datasource is your data supplier */ 
JasperFillManager.fillReport(report, parameterMap, dataSource); 
+0

所以我应该使用Java对象作为数据源,我已经在网络搜索,我还没有找到一个很好的例子:( – rym

+0

当你想运行报告与自定义SQL,你运行一个JDBC查询(或者一个Hibernate查询),并创建一个实现JRDataSource的类的实例,将结果集传递给构造函数,然后你只需使用结果集在你的类中实现这两个方法,并将该对象传递给fillReport方法如上所示,它非常简单。 – Chris