2012-09-07 13 views
6

JasperReportを使用して、必要に応じて日付フィルタを使用できるようにしたいとしましょう。 SQLは以下の通りである。JasperReportsの条件付き部分節

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

を今、私は彼らが日付を通過しなかった場合は、いくつかの日付でフィルタしたくない私は、人々が使用することを、次のその場しのぎを見つけました:

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

そしてsome.date.fragmentパラメータは、次のデフォルトで定義されています。これはtoStringとして機能していない

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

私のSQLサーバーが理解できる形式で出力しない日付を行います。私は、条件付きでjdbcドライバでプリペアドステートメントを使用して、そのパラメータを投げることを望みます。パラメータがnullであるかどうかに依存しているプリペアドステートメントを必要とします。これはできますか?

+0

この条件付きステートメントを使用することができます。 –

答えて

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クラス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} 
     ) 
+0

これらのソリューションのどちらも、私が理想的な解決策として望むものではありません。私は実行されているSQLを変更するnullパラメータが欲しいが、私はまた、入力をパラメータ化するjdbcドライバが必要です。私は日付の書式などを考えて嫌いです。しかし、2番目のオプションはより良いようですが、私はshow plan/explain planでいくつかのテストを行い、データベースは1 = 1の真条件がある場合に述語を無視してORを適切に処理します。 –

+0

これを見る人にはちょうど参考です。 'is_null_param'を別の1と比較する整数にします。文字列の比較は、いくつかのデータベースによって最適化されません。 –

+0

Jup。編集が完了しました。どうも。 – edze

1

私はあなたが関数を使用することができると思います。

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

thisヘルプページに表示されているように、クエリを最適化します。

0

あなたは私の場合は2番目のパラメータは文字列と私は$ P {のstringValue}を使用where句の一部であった

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