سؤال
لا بد لي من الاستعلام 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')