سؤال

لا بد لي من الاستعلام Message هذا في قائمة المقدمة Groups ولم يكن Deactivated من قبل المستخدم الحالي. فيما يلي بعض الكود الزائف لتوضيح الخصائص والكيانات:

class Message {
  private int messageId; 
  private String messageText;
}

class Group {
  private String groupId;
  private int messageId;
}

class Deactivated {
  private String userId;
  private int messageId;
}

فيما يلي فكرة عما أحتاج إلى الاستعلام عنه ، إنها الشرط الأخير والفقرة التي لا أعرف كيف أفعلها (قمت بتكوين المجمع NOT IN التعبير). يمكن أن يؤدي تصفية الرسائل التي تم إلغاء تنشيطها بواسطة UserD إلى MessageDs متعددة ، كيف يمكنني التحقق مما إذا كانت هذه المجموعة الفرعية من الصفوف لا تحتوي على MessageId؟

SELECT msg FROM Message msg, Group group, Deactivated unactive
WHERE 
  group.messageId = msg.messageId 
  AND (group.groupId = 'groupA' OR group.groupId = 'groupB' OR ...) 
  AND ('someUserId', msg.messageId) NOT IN (unactive.userId, unactive.messageId)

لاحظ ال ... هل هناك لأنني لا أعرف عدد المجموعات في وقت مبكر. أتلقىهم ك Collection<String> لذلك سأحتاج إلى اجتيازهم وإضافتها إلى JPQL ديناميكيًا.

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

المحلول

يبدو أنك تصنع منتجًا ديكارتًا في استفسارك. تحتاج إلى الحصول على مسمة فرعية للوصول إلى نتيجتك. يمكنك الحصول على استعلام مثل هذا:

 SELECT msg
 FROM Message msg, Group grp
 WHERE msg.id = grp.msgId 
       AND grp.id IN (...)
       AND msg.id NOT IN (SELECT msgId FROM Desactivated WHERE userId = 'uid') 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top