2010-03-28 27 views
0

我必须查询Message,该Message位于Groups的提供列表中,并且当前用户尚未得到Deactivated。下面是一些伪代码来说明的属性和实体:有关JPQL查询的帮助

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)。通过userId筛选停用的消息可能导致多个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中。

+0

你能澄清这个问题(顺便说一句,你可以使用'和group.groupId IN(:list)'而不是多个'或')? – 2010-03-29 08:50:43

+0

感谢您的提示,以减少分支条件。问题是'('someUserId',msg.messageId)NOT IN(unactive.userId,unactive.messageId)'是无效的 - 我不知道如何构建这部分查询。也许一个子查询是为了? – Lightbeard 2010-03-29 15:17:45

回答

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') 
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')