如何向查询传递参数?

17

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

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

由于用户可以选择 WHERE 子句和 ORDER BY 子句是动态的。

使用 $P{} 没有起作用。

2个回答

29

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

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

以下是示例:

| 参数名称        |  参数类型              | 参数值              |
|:---------------|-------------------|:---------------:|
|   eventName    | java.lang.String  |  Olympic Games  |
|   eventType    | 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} 语法 主要用于进行“简单”替换。

示例:

| 参数名 | 参数类型 | 参数值 |
|:-------|--------:|:------:|
| tableName | java.lang.String | events |
| eventName | java.lang.String | 奥运会 |
| channel | java.lang.String | 'BBC' |
| type | java.lang.String | sport |

原始表达式(待替换):

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

如需更多信息,您可以阅读此 使用报告参数 文章,并查看此 查询示例


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

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参数。


这里需要注意的是,参数显然需要是一个包含多个值的字符串,每个值都在单引号中,用逗号分隔。在我的测试中,如果没有单引号似乎无法正常工作。 - Woodchuck

-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接