0

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メッセージメッセージ、グループグループ、非アクティブ化非アクティブ
どこ
  group.messageId = msg.messageId
  AND(group.groupId ='groupA' OR group.groupId ='groupB' OR ...)
  AND('someUserId'、msg.messageId)NOT IN(unactive.userId、unactive.messageId)

注:...事前にgroupIdの数がわからないため、そこにあります。私はそれらをとして受け取るCollection<String>ので、それらをトラバースして、JPQLに動的に追加する必要があります。

4

1 に答える 1

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') 
于 2013-03-28T15:28:03.393 に答える