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.

Foi útil?

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') 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top