Помощь с запросом JPQL - PullRequest
       22

Помощь с запросом JPQL

0 голосов
/ 28 марта 2010

Я должен запросить 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. Как я могу проверить, не содержит ли это подмножество строк идентификатор сообщения?

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.

1 Ответ

1 голос
/ 28 марта 2013

Кажется, вы делаете декартово произведение по вашему запросу. Вам нужно иметь подзапрос, чтобы достичь вашего результата. у вас может быть такой запрос:

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