【发布时间】:2011-02-01 15:57:54
【问题描述】:
我必须查询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)
注意:... 之所以存在,是因为我事先不知道 groupId 的数量。我将它们作为Collection<String> 接收,因此我需要遍历它们并将它们动态添加到 JPQL。
【问题讨论】:
-
您能否澄清问题(顺便说一句,您可以使用
AND group.groupId IN (:list)而不是多个OR)? -
感谢您提供减少分支条件的提示。问题是
('someUserId', msg.messageId) NOT IN (unactive.userId, unactive.messageId)无效 - 我不知道如何构造这部分查询。也许一个子查询是有序的?