0

我必须查询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;
}

这是我需要查询的内容的一个想法,它是我不知道该怎么做的最后一个 AND 子句(我组成了复合NOT IN表达式)。按 userId 过滤停用的消息可能会导致多个 messageId,如何检查该行子集是否不包含 messageId?

SELECT msg FROM Message msg, Group group, Deactivated unactive
在哪里
  group.messageId = msg.messageId
  AND (group.groupId = 'groupA' OR group.groupId = 'groupB' OR ...)
  AND ('someUserId', msg.messageId) 不在 (unactive.userId, unactive.messageId)

注意:...因为我不知道 groupIds 的数量提前。我收到它们,Collection<String>所以我需要遍历它们并将它们动态添加到 JPQL。

4

1 回答 1

1

看来您正在查询中制作笛卡尔积。您需要有一个子查询才能到达您的结果。你可以有这样的查询:

 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') 
于 2013-03-28T15:28:03.393 回答