Вопрос
мне нужно запросить 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')