Вопрос

мне нужно запросить 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 выражение).Фильтрация деактивированных сообщений по идентификатору пользователя может привести к появлению нескольких идентификаторов сообщения. Как проверить, не содержит ли это подмножество строк идентификатор сообщения?

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)

Примечание:А ... есть ли это, потому что я заранее не знаю количества идентификаторов групп.Я получаю их как 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') 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top