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.

War es hilfreich?

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') 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top