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