【问题标题】:How to pass parameters to query?如何传递参数进行查询?
【发布时间】:2012-08-05 22:45:22
【问题描述】:

我正在尝试为我的应用程序编写查询,但遇到了一些问题。我需要将数据库的一个字段作为参数传递,例如:

SELECT name, phone, email 
FROM company 
WHERE $P{clause} = $P{key}
ORDER BY $P{order}

因为 WHERE 子句和 ORDER BY 子句是动态的,供用户选择。

使用$P{} 不起作用。

【问题讨论】:

    标签: sql jasper-reports parameter-passing


    【解决方案1】:

    JasperReports中有两种参数引用语法表达式:$P{}$P!{} em>。

    • $P{paramName} 语法 主要用于设置WHERE 输入参数值。替换算法很“智能”,它的实现使用java.sql.PreparedStatement:对于java.lang.String 参数,引擎将替换$P{parameterName } 带引号的值,对于 java.lang.Integer - 带数值等等。

    样本:

    |参数名称 |参数类型 |参数值 | |:---------------|-------|:------------ ----:| |事件名称 | java.lang.String |奥运会 | |事件类型 | java.lang.Integer | 2 |

    原始表达式(替换):

    SELECT startDate, endDate, rating FROM events WHERE name=$P{eventName} AND type=$P{eventType} 
    

    结果将是:

    SELECT startDate, endDate, rating FROM events WHERE name='Olympic Games' AND type=2 
    
    • $P!{paramName} 语法 主要用于“简单”替换。

    样本:

    |参数名称 |参数类型 |参数值 | |:---------------|------------------:|:------------ ----:| |表名 | java.lang.String |活动 | |事件名称 | java.lang.String |奥运会 | |频道 | java.lang.String | '英国广播公司' | |类型 | java.lang.String |运动 |

    原始表达式(替换):

    SELECT startDate, endDate, rating FROM $P!{tableName} WHERE name='$P!{eventName}' AND channel=$P!{channel} AND type=$P!{type} 
    

    结果将是:

    SELECT startDate, endDate, rating FROM events WHERE name='Olympic Games' AND channel='BBC' AND type=sport
    

    有关更多信息,您可以阅读此Using report parameters 帖子并查看此Query sample


    在你的情况下,正确的表达方式可能是这样的:

    SELECT name, phone, email FROM company WHERE $P!{clause} = $P{key} ORDER BY $P!{order}
    

    其中 $P{key}java.lang.String 参数

    或像这样(取决于$P!{clause} 值)

    SELECT name, phone, email FROM company WHERE $P!{clause} = $P!{key} ORDER BY $P!{order}
    

    其中 $P{key}java.lang.String 参数

    【讨论】:

    • 这里要注意的重要一点是参数显然需要是一个包含多个值的字符串,每个值都用单引号括起来,用逗号分隔。在我的测试中,如果没有单引号,它似乎不起作用。
    【解决方案2】:

    如果你需要按参数排序,试试这个:

    SELECT name, phone, email ,(case when $P{order} = 'name' then name when $P{order} = 'phone' then phone else email end) as orderlist
    FROM company 
    WHERE $P{clause} = $P{key}
    ORDER BY orderlist
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 2017-03-08
      • 2011-07-07
      相关资源
      最近更新 更多