7

Let's say I want a JasperReport that lets the user filter on a date if they so wish. The SQL is as follows:

select * from foo where bar = $P{bar} and some_date > $P{some.date}

Now, I don't want to filter by some date if they didn't pass the date in. I found the following kludge that people use:

select * from foo where bar = $P{bar} $P!{some.date.fragment}

And the some.date.fragment parameter is defined with the following default:

($P{some.date} == null || $P{some.date}.equals("")) ? "" : "AND some_date >'" + new java.sql.Date($P{some.date}.getTime()).toString() + "'"

This is not working as the toString doesn't output the date in a format that my SQL server understands. I would like to have the conditional still use a prepared statement with the jdbc driver and toss the parameter in, I just want the prepared statement to be dependent on if the parameter is null or not. Can this be done?

4

3 に答える 3

6

式を使用する前に$P!{}、JDBC-Driver がすべてのフォーマットを行います。

ただし、$P!{}式を使用する場合は、自分でフォーマットする必要があります。

このようなものが動作するはずです:

(
$P{some.date} == null 
? 
"" 
: 
"AND some_date >'" + (new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS")).format($P{some.date}) + "'"
)

データ型に応じて、カスタマイズする必要がありますdd.MM.yyyy HH:mm:ss.SSS

式を使用したくない場合は$P!{}、以下の解決策で回避できます。

私は個人的にこの方法が好きではありません。また、不適切な実行計画が発生する可能性もあります。

$P!{}sqlインジェクションが心配で使いたくない場合。$P{some.date}パラメータに のような安全なデータ型が含まれている限り、これは不要java.lang.Dateです。


パラメータを作成します。${is_null_pram}それを呼び出して、param class でデフォルト式を追加しましょうInteger:

($P{some.date} == null ? 1 : 0)

これで、次のクエリを実行できます。

SELECT 
    * 
FROM foo 
WHERE
    bar = $P{bar}
    AND
        (
            some_date > $P{some.date}
            OR 1 = $P{is_null_pram}
        )
于 2012-09-10T17:20:51.873 に答える
1

関数を使用できると思います:

$X{EQUAL, <column_name>, <parameter_name>}

このヘルプページでわかるように、クエリを最適化します。

于 2012-12-28T16:51:30.667 に答える
0

この条件文を使用できます

    select * 
    from foo 
    where bar = $P{bar} and some_date > $P{some.date} or $P{some.date}  is null
于 2012-12-31T09:31:18.027 に答える