Frage
ich eine Message
abzufragen, die in einer bereitgestellten Liste von Groups
ist und war nicht Deactivated
durch den aktuellen Benutzer. Hier einige Pseudo-Code die Eigenschaften und Entitäten zu veranschaulichen:
class Message {
private int messageId;
private String messageText;
}
class Group {
private String groupId;
private int messageId;
}
class Deactivated {
private String userId;
private int messageId;
}
Hier ist eine Idee von dem, was ich zu Abfrage benötigen, benutzen sie die letzte ist AND-Klausel, dass ich weiß nicht, wie zu tun (ich habe die Verbindung NOT IN
Ausdruck nach oben). Filtern der deaktivierten Meldungen von userId können in mehreren messageIds führen, wie kann ich überprüfen, ob die Teilmenge der Zeilen nicht die messageId enthält?
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)
Hinweis: Die ...
ist da, weil ich weiß nicht, die Anzahl der Gruppenkenn vor der Zeit. Ich erhalte sie als Collection<String>
so werde ich sie durchqueren müssen, und fügen Sie sie dem JPQL dynamisch.
Lösung
Es scheint, dass Sie ein kartesisches Produkt in Ihrer Anfrage machen. Sie müssen eine Unterabfrage haben, um Ihr Ergebnis zu erreichen. Sie können eine Abfrage wie folgt aussehen:
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')