سؤال

أحاول تعيين معلمة في استعلامي ، على سبيل المثال:

select * from Cars where Cars.color NOT IN (:color_params)

وعندما أضيف المعلمة في Javaclass مثل:

...
query.setParameter("color_params", "RED,BLUE");
...

وهذا لا يعمل ، يعمل فقط مع معلمة واحدة فقط.
لقد حاولت مع "'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 (على الأقل السبات) لديه عمل شاق لتحليل كل استعلام. لذا فإن الاستعلام المتدرج يذهب إلى ذاكرة التخزين المؤقت ، لإعادة استخدامها. إذا تم بناء سلسلة الاستعلام في وقت التشغيل من المعلمات ، فقد لا يكون ذلك أبدًا مرتين ، لذلك يتم فقدان الكثير من الوقت ، وقوة الحوسبة وذاكرة ذاكرة التخزين المؤقت. ولكن إذا كنت تستخدم نفس سلسلة الاستعلام مع معلمات مختلفة ، Bingo: Fast و Hand Memory Use و Low CPU متطلبات.
  2. منع حقن SQL. يتم تقديم هذا الضمان إذا كنت تستخدم المعلمات. إذا قمت بإنشاء سلسلة الاستعلام الخاصة بك مع المعلمات ، فعليك أن تقدم لنفسك هذا الضمان ...!

نصائح أخرى

يجب أن تمر في قائمة الأوتار ، وليس سلسلة واحدة. JPA لا تحليل قيمك ، يجب عليك تقسيمها بنفسك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top