Question
Je dois interroger une Message
qui se trouve dans une liste fournie de Groups
et n'a pas été Deactivated
par l'utilisateur actuel. Voici quelques pseudo-code pour illustrer les propriétés et les entités:
class Message {
private int messageId;
private String messageText;
}
class Group {
private String groupId;
private int messageId;
}
class Deactivated {
private String userId;
private int messageId;
}
Voici une idée de ce que je dois interroger pour, il est le dernier et l'article que je ne sais pas comment faire (j'ai fait le composé expression NOT IN
). Filtrage des messages désactivés par userId peut entraîner plusieurs messageIds, comment puis-je vérifier si ce sous-ensemble de lignes ne contient pas le 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)
Note: Le ...
est là parce que je ne sais pas le nombre de groupids à l'avance. Je les reçois comme Collection<String>
donc je vais devoir les traverser et les ajouter à la JPQL dynamiquement.
La solution
Il semble que vous faites un produit cartésien dans votre requête. Vous devez avoir une sous-requête pour atteindre à votre résultat. vous pouvez avoir une requête comme ceci:
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')