15

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

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

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

使用$P{}它没有用。

4

2 回答 2

29

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

  • $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

有关更多信息,您可以阅读这篇使用报告参数帖子并查看此查询示例


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

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

于 2012-08-09T06:36:20.767 回答
-1

如果您需要按参数订购,请尝试以下操作:

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
于 2014-10-24T07:43:53.067 回答