سؤال

على هذه سؤال أنا حل مشكلة الاستعلام عن Google Datastore لاسترداد الاشياء بواسطة المستخدم (com.google.appengine.api.user.user) مثل هذا:

User user = userService.getCurrentUser();
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == paramAuthor"); 
query.declareParameters("java.lang.String paramAuthor"); 
greetings = (List<Greeting>) query.execute(user);

ما ذكر أعلاه يعمل بشكل جيد - ولكن بعد القليل من العبث حولك، أدركت هذا بناء الجملة غير عملي للغاية كحتاج إلى بناء استفسارات أكثر تعقيدا تنشأ - لذلك قررت إنشاء مرشحاتي يدويا والآن حصلت على شيء مثل ما يلي (أين عادة ما يتم تمرير الفلتر كأداة متغيرة السلسلة ولكن الآن بنيت مضمنة للبساطة):

User user = userService.getCurrentUser();    
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == '"+ user.getEmail() +"'");  
greetings = (List<Greeting>) query.execute();

من الواضح أن هذا لن يعمل حتى لو كان هذا بناء الجملة مع field = 'value' يكون بدعم من jdedql. ويعمل بشكل جيد في المجالات الأخرى (أنواع السلسلة والعودة). الشيء الآخر الغريب هو أن النظر في عارض البيانات في لوحة معلومات تشغيل التطبيقات يتم تخزين "مؤلف" حقل "المؤلف" كنوع المستعمل ولكن القيمة هي "user@gmail.com"، ثم مرة أخرى عندما أقوم بتعيينها كمعلمة (الحالة أعلاه تعمل بشكل جيد)، أعلن المعلمة كسلسلة ثم اجتياز مثيل المستخدم (المستخدم) الذي يحصل عليه تسلسل بسيطة toString() (أظن).

أي شخص أي فكرة؟

هل كانت مفيدة؟

المحلول

باستخدام استبدال السلسلة في لغات الاستعلام هو دائما فكرة سيئة. من السهل جدا أن ينكسر المستخدم والفوضى مع بيئتك، ويقدم مجموعة كاملة من مشكلات الترميز، إلخ.

ما الخطأ في نهج استبدال المعلمة السابقة؟ بقدر ما أعرف، فإنه يدعم كل شيء، وتجنب أي مشاكل تحليل. فيما يتعلق بالمشكلة المتعلقة بمعرفة عدد الحجج التي يتم تمريرها، يمكنك استخدام Query.executeWithmap أو Query.ExecuteWitharray لتنفيذ استعلام مع عدد غير معروف من الحجج.

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