編集-JPQLリポジトリで実行する「動的」クエリを作成します
この機能をクリアするためにユースケースを追加します。
ユーザは、開始日と終了日の2つの日付を選択し、これらを引き渡して使用してテーブルを選択します(毎年独自のテーブルがあります)。指定された2つの日付が同じ年にある1つのユースケースでは、そのテーブルだけで簡単なクエリです。
ただし、2つの日付が異なる場合は、すべての表を結合する必要があります(2011〜2013は3つの表が接続されているため、検索することができます)。私は、以下のようなクエリを構築することがセキュリティに反していることを知っています。システムは、毎年新しいテーブルを取得するとして、私はまた
(等。2011年から2019年、2014年から2018年、2011年から2016年)を手動で各ケースについてしかし、多くの新しいクエリを追加する必要がしたくない私が持っています以下のような文字列として動的クエリを作成し、それをサービス - >リポジトリに渡してクエリとして使用できるかどうかについての質問?
for (int i = 0; i < yearCondition; i++) {
if (i == 0) {
query += "SELECT md.Device_ID, l.locationRef, " + reportRunForm.getStartDate() + " as 'From Date', "
+ reportRunForm.getEndDate() + " as 'To Date' "
+ "from mData.meterdata" + iDateStart.substring(0, 4)
+ " join MOL2.meters m on device_ID = m.meterUI "
+ "join MOL2.locations l on m.locationID = l.locationID "
+ "join MOL2.meterreg mr on m.meterID = mr.meterID "
+ "where mr.userID = ?1";
}
query += "UNION SELECT md.Device_ID, l.locationRef, " + reportRunForm.getStartDate() + " as 'From Date', "
+ reportRunForm.getEndDate() + " as 'To Date' "
+ "from mData.meterdata" + (Integer.parseInt(iDateStart.substring(0, 4))+i)
+ " join MOL2.meters m on device_ID = m.meterUI "
+ "join MOL2.locations l on m.locationID = l.locationID "
+ "join MOL2.meterreg mr on m.meterID = mr.meterID "
+ "where mr.userID = ?1";
}
私はこれがどのように動作するかとの間違った考えを持っていること、そして私がのEntityManagerを通じてクエリを作成し、持続可能性を知っているが、リポジトリを通してそれをやってすることが可能であるかどうかを知りたいと思いましたか?
私は上記のようなクエリを構築し、サービスに渡してリポジトリに渡し、@Queryアノテーションの値としてバインドすると考えましたが、これは可能ではないようです。私はこの間違いに近づいているので、どんな助言も高く評価されます。
ありがとうございました。
編集 -
愚かなことをやっていることを理解すると、類似のものを構築するアプローチが、私が探しているのはまだ安全です。
あなたは* *クエリに変数を追加することはありません直接SQLステートメントを使用して、SQLインジェクション攻撃を防ぐための変数置換を使用してください([this post](http://security.stackexchange.com/questions/10974/what-is-sql-injection)を参照)。詳細についてはsecurity.seを参照してください)。 – MTCoster
一般的に私は変数を使用していたのと同じ状況だったという準備文を使用しますが、私はどこにいるのか分かります。 私は動的にこのステートメントを準備することはできませんが、使用するテーブルが変更され、必要なさまざまなクエリの数が多すぎます(2010〜2016年と何年もの間データを取得する - それは余分な年に成長する)。 – Mike
どのような価値が動的に伝わってくるか教えてください。 –