Pregunta

Tengo que consultar una Message que está en una lista proporcionada de Groups y no ha sido Deactivated por el usuario actual. Aquí hay un código de pseudo para ilustrar las propiedades y 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;
}

Esta es una idea de lo que necesito para la consulta, que es la última y la cláusula que no sé cómo hacerlo (me inventé la expresión NOT IN compuesto). El filtrado de los mensajes desactivados por ID de usuario puede dar lugar a múltiples messageids, ¿cómo puedo comprobar si ese subconjunto de filas no contiene el 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)

Nota: El ... está ahí porque no sé el número de groupIds antes de tiempo. Las recibo como Collection<String> así que necesitaré que pasar por ellas y añadirlos a la JPQL dinámicamente.

¿Fue útil?

Solución

Parece que usted está haciendo un producto cartesiano en su consulta. Es necesario tener una subconsulta para llegar a su resultado. usted puede tener una consulta como la siguiente:

 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top