Pergunta
Eu tenho que consultar um Message
isso está em uma lista fornecida de Groups
e não foi Deactivated
pelo usuário atual. Aqui está algum código pseudo para ilustrar as propriedades e entidades:
class Message {
private int messageId;
private String messageText;
}
class Group {
private String groupId;
private int messageId;
}
class Deactivated {
private String userId;
private int messageId;
}
Aqui está uma idéia do que eu preciso consultar, é a última e cláusula que eu não sei como fazer (eu inventei o composto NOT IN
expressão). Filtrar as mensagens desativadas pelo UserID pode resultar em vários messageIds, como posso verificar se esse subconjunto de linhas não contém o 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)
Note o ...
está lá porque não conheço o número de grupos com antecedência. Eu os recebo como um Collection<String>
Então, precisarei atravessá -los e adicioná -los ao JPQL dinamicamente.
Solução
Parece que você está fazendo um produto cartesiano em sua consulta. Você precisa ter uma subconsulta para alcançar seu resultado. Você pode ter uma consulta como esta:
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')