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.

Était-ce utile?

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') 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top