2011-06-27 153 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