7

クエリにパラメータを設定しようとしています。次に例を示します。

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

私が間違っているのは何ですか!?

前もって感謝します

4

2 に答える 2

14

あなたはリストを渡すことになっています。

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)は、各クエリの解析に苦労します。したがって、解析されたクエリはキャッシュに入れられ、再利用されます。クエリ文字列が実行時にパラメータから作成される場合、同じになることは決してない可能性があるため、多くの時間、計算能力、およびキャッシュメモリが失われます。ただし、同じクエリ文字列を異なるパラメータで使用する場合、bingo:高速、低メモリ使用量、低CPU要件。
  2. SQLインジェクションを防止します。この保証は、パラメーターを使用する場合に提供されます。パラメータを使用してクエリ文字列を作成する場合は、この保証を自分で提供する必要があります...!
于 2009-12-22T16:24:07.130 に答える
2

単一の文字列ではなく、文字列のリストを渡す必要があります。JPAは値を解析しません。自分で値を分割する必要があります。

于 2009-12-22T16:23:42.950 に答える