帮助JPQL查询

时间:2010-03-28 02:12:59

标签: jpa jpql openjpa

我必须查询当前用户提供的Message列表中Groups并且尚未Deactivated的{​​{1}}。下面是一些伪代码来说明属性和实体:

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表达式)。通过userId过滤已停用的消息可能会导致多个messageId,如何检查该行的子集是否不包含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)

注意:...存在,因为我不知道groupIds的数量。我以Collection<String>的身份收到它们,所以我需要遍历它们并动态地将它们添加到JPQL中。

1 个答案:

答案 0 :(得分:1)

您的查询中似乎正在制作笛卡尔积。您需要有子查询才能达到结果。你可以这样查询:

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