質問

たとえば、クエリにパラメータを設定しようとしています。

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);

一般的なルールとして、文字列をカスタマイズする代わりに、パラメータを固定クエリに渡すことが好まれることがよくあります。利点は次のとおりです。

  1. 解析の削減:JPA 実装 (少なくとも Hibernate) では、各クエリを解析するのに大変な作業が必要です。したがって、解析されたクエリはキャッシュに保存され、再利用されます。クエリ文字列が実行時にパラメーターに基づいて構築される場合、2 度と同じになることはなく、多くの時間、計算能力とキャッシュ メモリが失われます。ただし、同じクエリ文字列を異なるパラメータで使用すると、 bingo :高速、低メモリ使用量、低 CPU 要件。
  2. SQLインジェクションを防止する. 。この保証は、パラメーターを使用する場合に提供されます。パラメーターを使用してクエリ文字列を構築する場合は、この保証を自分で提供する必要があります...!

他のヒント

あなたは文字列のリストではなく、単一の文字列を渡す必要があります。 JPAは、自分の価値観を解析していない、あなたはそれらを自分で分割する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top