我必须查询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表达)。过滤由用户id停用消息可以导致多个messageIds,我怎样才能检查是否行的该子集不包含的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)

注:...是那里,因为我不知道组id的数量提前。我接收它们作为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') 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top