2014-09-19 71 views
0

下面是我在Jasper Report中運行的SQL語句。我已經想出瞭如何通過報告參數進行動態查詢。我從fromDate和toDate參數工作正常。我遇到的問題是向WhereClause添加額外的SQL,並在該SQL中計算額外的參數。Jasper報告使用參數的動態查詢

$ P的值!{} userName_sql是

" and u.u_username = $P{userName} " 

我結束了一個SQL錯誤,因爲用戶名參數沒有進行評估時追加到SQL。我可以通過像這樣連接來解決問題:

" and u.u_username = '" + $P{userName} + "'" 

但是該參數可以被SQL注入。 有沒有辦法讓參數進行評估而不必連接它?

SQL

SELECT tw.time_dt, ca.claimaudit_no,concat(u.u_firstnm, ' ', u.u_lastnm) user, ca.ca_claimtype, tw.time_workflowqueue, sum(tw.time_minutes/60) hrs, 
        (
            select count(*) cnt from hcfasline hsline 
            where hsline.hcfa_no = phases.hcfa_no 
            union 
            select count(*) cnt from ubdtlsline dtlsline 
            inner join ubsline usline on usline.ubsline_no = dtlsline.ubsline_no 
            where usline.ub_no = phases.ub_no 
            order by cnt desc 
            limit 1 
        ) linecnt 
    FROM timeworksheet tw 
    inner join users u on tw.users_no = u.users_no 
    inner join claimaudit ca on tw.claimaudit_no = ca.claimaudit_no 
    inner join claimauditphases phases on tw.claimauditphase_no = phases.claimauditphase_no 
    where tw.time_dt between $P{fromDate} and $P{toDate}$P!{userName_sql} 
    group by claimaudit_no, user, ca.ca_claimtype, tw.time_workflowqueue, tw.time_dt 
    order by user, ca.ca_claimtype 

回答

1

我不明白爲什麼要傳遞的查詢參數通過名稱來過濾記錄,只需你可以創建一個參數(用戶名)通過用戶的價值。例如: -

Where tw.time_dt between $P{fromDate} and $P{toDate} 
     and (u.u_username = $P{userName} or $P{userName} is null) 

或$ P {userName}爲null條件使參數可選。

但是,如果您想要在參數中使用查詢,請再添加一個參數以在 $ P!{userName_sql}參數中傳遞用戶名。

+0

用戶名是一個可選參數是可選的。這就是我使用查詢塊參數的原因。我在我的username_sql中有一個參數,但它不會評估,除非我使用串聯,但是這樣可以進行SQL注入。 – 2014-09-21 13:32:37

+0

要使參數可選,您可以檢查我的更新答案。 – Sharad 2014-09-21 15:42:39

+0

但是,謝謝,這是行不通的。數據庫中沒有空的用戶名。這是可選的,運行報告的人員可以篩選特定用戶或省略它並返回所有用戶。但是,這確實給了我一個想法。也許我可以追加或1 = 1,如果他們傳遞的userName參數是空的。我希望有更好的解決方案。 – 2014-09-22 15:19:53