【问题标题】:Jasper Reports Dynamic Query With ParameterJasper 报告带参数的动态查询
【发布时间】:2014-09-19 18:48:35
【问题描述】:

下面是我在 Jasper 报告中运行的 SQL 语句。我已经弄清楚如何通过报告参数进行动态查询。我的 fromDate 和 toDate 参数工作正常。我遇到的问题是向 WhereClause 添加额外的 SQL 并在该 SQL 中评估额外的参数。

$P!{userName_sql} 的值为

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

我最终得到一个 SQL 错误,因为在将 userName 参数附加到 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

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

    我不明白您为什么将查询传递给参数以按名称过滤记录,只需创建一个参数(userName)来传递用户的值。例如:-

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

    或 $P{userName} 为空条件以使参数可选。

    但是如果你想在参数中使用查询,那么再添加一个参数来传递用户名 $P!{userName_sql} 参数。

    【讨论】:

    • 用户名是可选参数是可选的。这就是我使用查询块参数的原因。我的 username_sql 中有一个参数,但除非我使用连接,否则它不会评估,但这允许 SQL 注入。
    • 谢谢,但是这行不通。数据库中没有空用户名。从某种意义上说,它是可选的,运行报告的人可以过滤到特定用户或忽略它并返回所有用户。不过,这确实给了我一个想法。如果他们传递的 userName 参数为空,也许我可以附加或 1=1 。我希望有更好的解决方案。
    • 忽略我之前的评论。我看到是将参数与 null 而不是列进行比较。好主意!我会试一试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多