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