题
我必须查询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')
不隶属于 StackOverflow