「NOT IN (:param)」を処理する場合の JPA setParameter
-
20-09-2019 - |
質問
たとえば、クエリにパラメータを設定しようとしています。
select * from Cars where Cars.color NOT IN (:color_params)
そして、JavaClassにパラメータを追加すると、次のようになります。
...
query.setParameter("color_params", "RED,BLUE");
...
そして、これは機能しません、でのみ機能します パラメータは 1 つだけ.
で試してみました "'RED','BLUE'"
そして取り組んでいません。
たとえば、クエリにパラメータを入力すると、次のように機能します。
select * from Cars where Cars.color NOT IN ('RED','BLUE')
私の何が間違っているのですか?
前もって感謝します
解決
リストを渡す必要があります。
List<String> colors = ....;
String query = "select * from Cars where Cars.color NOT IN (:color_params)";
Map<String, Object> params = new HashMap<String, Object>();
params.put("color_params", colors);
// ... execute the query with the param.
次のこともできます:
query.setParameter("color_params", colors);
一般的なルールとして、文字列をカスタマイズする代わりに、パラメータを固定クエリに渡すことが好まれることがよくあります。利点は次のとおりです。
- 解析の削減:JPA 実装 (少なくとも Hibernate) では、各クエリを解析するのに大変な作業が必要です。したがって、解析されたクエリはキャッシュに保存され、再利用されます。クエリ文字列が実行時にパラメーターに基づいて構築される場合、2 度と同じになることはなく、多くの時間、計算能力とキャッシュ メモリが失われます。ただし、同じクエリ文字列を異なるパラメータで使用すると、 bingo :高速、低メモリ使用量、低 CPU 要件。
- SQLインジェクションを防止する. 。この保証は、パラメーターを使用する場合に提供されます。パラメーターを使用してクエリ文字列を構築する場合は、この保証を自分で提供する必要があります...!
他のヒント
あなたは文字列のリストではなく、単一の文字列を渡す必要があります。 JPAは、自分の価値観を解析していない、あなたはそれらを自分で分割する必要があります。
所属していません StackOverflow