我必须查询当前用户提供的Message
列表中Groups
并且尚未Deactivated
的{{1}}。下面是一些伪代码来说明属性和实体:
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 WHERE group.messageId = msg.messageId AND (group.groupId = 'groupA' OR group.groupId = 'groupB' OR ...) AND ('someUserId', msg.messageId) NOT IN (unactive.userId, unactive.messageId)
注意:...
存在,因为我不知道groupIds的数量。我以Collection<String>
的身份收到它们,所以我需要遍历它们并动态地将它们添加到JPQL中。
答案 0 :(得分: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')