2010-03-28 49 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')